2012-03-01 55 views
0

我意識到,這裏有一些問題,但我認爲我的代碼是真的不同於他們(我是一個初學者),我無法理解他們的答案!刷新我的ListView,每當我有一個新的短信

所以我想刷新我的ListView每次我收到一條短信,我試圖使用cursor.requery();和一些方法,我發現谷歌,但它仍然無法正常工作。

這是我的代碼:

public class SMSActivity extends Activity implements OnItemClickListener { 

ArrayList<String> smsList = new ArrayList<String>(); 
// String ADDRESS[]; 
// int total = 0; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ContentResolver cr = getContentResolver(); 
    Cursor cursor = cr.query(Uri.parse("content://sms/inbox"), null, null, 
      null, null); 

    int indexBody = cursor.getColumnIndex("body"); 
    int indexAddr = cursor.getColumnIndex("address"); 

    if (indexBody < 0 || !cursor.moveToFirst()) 
     return; 

    smsList.clear(); 
    do { 
     String str = "Sender : " + cursor.getString(indexAddr) + "\n" 
       + cursor.getString(indexBody); 
     smsList.add(str); 
     // ADDRESS[total] = cursor.getString(indexAddr); 
     // total++; 
    } while (cursor.moveToNext()); 

    ListView lvSms = (ListView) findViewById(R.id.SMSList); 
    lvSms.setAdapter(new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, smsList)); 

    // cursor.requery(); 
    lvSms.setOnItemClickListener(this); 
} 

編輯: 而這正是我與廣播接收器擴展它的類:

public class SMSReceiver extends BroadcastReceiver { 

private static final int NOTIF_ID = 0; 

@Override 
public void onReceive(Context arg0, Intent arg1) { 
    // TODO Auto-generated method stub 

    Bundle bundle = arg1.getExtras(); 
    SmsMessage[] msgs = null; 
    String str = ""; 
    if (bundle != null) { 
     Object[] pdus = (Object[]) bundle.get("pdus"); 
     msgs = new SmsMessage[pdus.length]; 

     for (int i = 0; i < msgs.length; i++) { 
      msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
      str += "You Get New SMS from " + msgs[i].getOriginatingAddress(); 
      str += " :";     str += msgs[i].getMessageBody().toString(); 
      str += "\n"; 

     Toast.makeText(arg0, str, Toast.LENGTH_SHORT).show(); 

     NotificationManager nm = (NotificationManager) arg0.getSystemService(Context.NOTIFICATION_SERVICE); 

     String tickerText = str; 

     Notification notif = new Notification(R.drawable.ic_launcher, tickerText, System.currentTimeMillis()); 

     notif.flags = Notification.FLAG_AUTO_CANCEL; 

     String contentTitle = msgs[i].getOriginatingAddress(); 
     String contentText = msgs[i].getMessageBody().toString(); 

     Intent intent = new Intent(arg0, SMSReply.class); 
     PendingIntent pi = PendingIntent.getActivity(arg0, 0, intent, 0); 

     notif.setLatestEventInfo(arg0, contentTitle, contentText, pi); 
     notif.defaults = Notification.DEFAULT_ALL; 
     nm.notify(NOTIF_ID, notif); 

     String tempSMS = msgs[i].getOriginatingAddress(); 
     Intent pass = new Intent(); 
     Bundle bundlePass = new Bundle(); 

     bundlePass.putString("key", tempSMS); 
     pass.putExtras(bundlePass); 
     } 
    } 
} 

我不知道如何這兩個類鏈接,以便每次BroadcastReceiver工作(新短信來)我的ListView將更新(就像你的手機短信應用程序)

謝謝所有。

+1

你告訴列表應該在收到短信時更新。您的Braodcast Receiver在哪裏? – 2012-03-01 10:10:39

+0

錯誤..我有它在另一個類...我會更新我的問題,謝謝先生:D – 2012-03-01 10:24:43

回答

1

定義適配器作爲全球公共變量,

ArrayAdapter<String> adapter; 

onCreate()分配給它,

adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, smsList)); 

BroadcastReceiver訪問smsList並添加到其新的SMS,

然後訪問您的適配器這種方式,

adapter.notifyDataSetChanged(); 

此函數將通知適配器smsList值已更改並將更新列表。

+0

謝謝先生:D 但我有一個問題,我不明白如何做這句話「在您的BroadcastReceiver訪問smsList並添加到它的新短信, 然後以這種方式訪問​​您的適配器「這是我的問題的來源,我已經想過鏈接我的列表,但我不知道該怎麼做。 謝謝先生:D – 2012-03-01 12:50:24

+0

順便說一句,有2個適配器先生可以嗎?我在我的SMSActivity類的最後一句中創建了自己的,我創建了您的適配器,所以在我的SMSActivity類中有2個適配器。 我的意思是,他們可以同步嗎? 謝謝先生:D – 2012-03-01 12:52:40

+1

我的意思是每當你收到一個短信(onReceive),你必須用新的短信(add()函數)更新smsList數組,然後通知適配器smsList已被更改,約2個適配器,我相信不是,我傾向於在你的活動類 – 2012-03-01 14:06:22

0

您可以創建一個BroadcastReceiver類的抽象方法,像這樣:

public class MyReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context arg0, Intent arg1) { 
     ... 
     do your stuff here 
     ... 

     myAbsMethod(newSms); 
    } 
    public abstract void myAbsMethod(String sms); 
} 

然後,在你的活動,你做這樣的事情:

public class MyActivity extends Activity { 
    private final MyReceiver myReceiver; 
    private ArrayList<String> smsList = new ArrayList<String>(); 

    ... 

    public MyActivity() { 
     myReceiver = new MyReceiver() { 
      @Override 
      public void myAbsMethod(String sms) { 
       smsList.add(sms); 
      } 
     }; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     ... 
     IntentFilter filterState = new IntentFilter(YOUR_SMS_ACTION); 
     registerReceiver(myReceiver, filterState) 
    } 

    ... 

    @Override 
    public void onDestroy() { 
     ... 
     unregisterReceiver(myReceiver); 
    } 
} 

所以,基本上,你在你的活動類中註冊這個接收器,然後當你接收到這個廣播時,你的活動將會監聽,並且你可以用這個重寫的抽象方法做你想做的任何事情。

+1

這可能嗎? bcoz當我在我的brodcast接收器類中聲明抽象方法時,它的類應該是抽象的,如果我抽象了類,那麼在我的活動中,我不能安裝我的bordcast reveiver,因爲抽象類不能安裝。 – sandy 2013-06-25 07:11:40

相關問題