Обновление моего ListView каждый раз, когда я получаю новое SMS - PullRequest
0 голосов
/ 01 марта 2012

Я понял, здесь есть несколько вопросов, но я думаю, что мой код действительно отличается от них (я новичок), и я не могу понять их ответы!

Так что я хочу обновитьмой ListView каждый раз, когда я получаю SMS, я пытался использовать cursor.requery(); и некоторые методы, которые я нашел в Google, но он все еще не работает.

Это мой код:

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);
}

EDITED: И это класс, где я расширяю его с помощью BroadcastReceiver:

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 (приходит новое SMS), мой ListView будет обновляться (простокак приложение SMS в вашем телефоне)

Спасибо всем.

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Определить адаптер как глобальную общедоступную переменную,

ArrayAdapter<String> adapter;

внутри onCreate() назначить,

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

в вашем BroadcastReceiver доступе к smsList и добавьте к нему новые смс,

затем получите доступ к вашему адаптеру таким образом,

adapter.notifyDataSetChanged();

эта функция уведомит адаптер об изменении значений smsList и обновит список.

0 голосов
/ 01 марта 2012

Вы можете создать класс 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);
    }
}

Итак, в основном,вы регистрируете этого получателя в своем классе активности, затем всякий раз, когда вы получаете эту трансляцию, ваша активность будет прослушиваться, и вы можете делать все, что захотите, в этом переопределенном абстрактном методе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...