2

我的 SMSReceiverActivity.java 上有以下代码:

package com.example.smsTest;

import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class SMSReceiverActivity extends ListActivity {
    private SQLiteAdapter mySQLiteAdapter;

    private List<String> bodyarr = new ArrayList<String>();
    private ArrayAdapter<Message> arrayAdpt;

    private BroadcastReceiver mIntentReceiver;
    ListView listview;

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

        mySQLiteAdapter = new SQLiteAdapter(this);
        mySQLiteAdapter.openToRead();

        List<Message> bodyarr = mySQLiteAdapter.getAllMessages();

        listview=this.getListView();

        arrayAdpt = new ArrayAdapter<Message>(SMSReceiverActivity.this,
                android.R.layout.simple_list_item_1, bodyarr);
        listview.setAdapter(arrayAdpt);       
    }

    @Override
    protected void onResume() {
        super.onResume();

        IntentFilter intentFilter = new IntentFilter("SmsMessage.intent.MAIN");
        mIntentReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String msg = intent.getStringExtra("get_msg");

                //Process the sms format and extract body &amp; phoneNumber
                msg = msg.replace("\n", "");
                String body = msg.substring(msg.lastIndexOf(":")+1, msg.length());
                String pNumber = msg.substring(0,msg.lastIndexOf(":"));

                bodyarr.add(body);
                arrayAdpt.notifyDataSetChanged();

                /*
                 *  Create/Open a SQLite database
                 *  and fill with dummy content
                 *  and close it
                 */
                mySQLiteAdapter = new SQLiteAdapter(SMSReceiverActivity.this);
                mySQLiteAdapter.openToWrite();
                //mySQLiteAdapter.deleteAll();

                mySQLiteAdapter.insert(body);

                mySQLiteAdapter.close();
            }
    };

    this.registerReceiver(mIntentReceiver, intentFilter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        this.unregisterReceiver(this.mIntentReceiver);
    }

}

这是 SQLiteAdapter.java 的代码:

package com.example.smsTest;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

public class SQLiteAdapter {

    public static final String MYDATABASE_NAME = "MY_DATABASE";
    public static final String MYDATABASE_TABLE = "MY_TABLE";
    public static final int MYDATABASE_VERSION = 1;
    public static final String KEY_ID = "_id";
    public static final String KEY_CONTENT = "Content";

    //create table MY_DATABASE (ID integer primary key, Content text not null);
    private static final String SCRIPT_CREATE_DATABASE =
    "create table " + MYDATABASE_TABLE + " ("
    + KEY_ID + " integer primary key autoincrement, "
    + KEY_CONTENT + " text not null);";

    private SQLiteHelper sqLiteHelper;
    private SQLiteDatabase sqLiteDatabase;

    private Context context;

    public SQLiteAdapter(Context c){
        context = c;
    }

    public SQLiteAdapter openToRead() throws android.database.SQLException {
        sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
        sqLiteDatabase = sqLiteHelper.getReadableDatabase();
        return this;
    }

    public SQLiteAdapter openToWrite() throws android.database.SQLException {
        sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
        sqLiteDatabase = sqLiteHelper.getWritableDatabase();
        return this;
    }

    public void close(){
        sqLiteHelper.close();
    }

    public long insert(String content){

        ContentValues contentValues = new ContentValues();
        contentValues.put(KEY_CONTENT, content);
        return sqLiteDatabase.insert(MYDATABASE_TABLE, null, contentValues);
    }

    public int deleteAll(){
        return sqLiteDatabase.delete(MYDATABASE_TABLE, null, null);
    }

    public Cursor queueAll(){
        String[] columns = new String[]{KEY_ID, KEY_CONTENT};
        Cursor cursor = sqLiteDatabase.query(MYDATABASE_TABLE, columns,
        null, null, null, null, null);

        return cursor;
    }

    public List<Message> getAllMessages() {
        String[] columns = new String[]{KEY_ID, KEY_CONTENT};
        List<Message> messages = new ArrayList<Message>();

        Cursor cursor = sqLiteDatabase.query(MYDATABASE_TABLE,
                columns, null, null, null, null, null);

        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            Message message = cursorToMessage(cursor);
          messages.add(message);
          cursor.moveToNext();
        }
        // Make sure to close the cursor
        cursor.close();
        return messages;
      }

    public class SQLiteHelper extends SQLiteOpenHelper {

        public SQLiteHelper(Context context, String name,
        CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL(SCRIPT_CREATE_DATABASE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub

        }

    }

      private Message cursorToMessage(Cursor cursor) {
          Message message = new Message();
          message.setId(cursor.getLong(0));
          message.setMessage(cursor.getString(1));
          return message;
      }

}

这是 Message.java 代码:

package com.example.smsTest;

public class Message {
      private long id;
      private String message;

      public long getId() {
        return id;
      }

      public void setId(long id) {
        this.id = id;
      }

      public String getMessage() {
        return message;
      }

      public void setMessage(String message) {
        this.message = message;
      }

      // Will be used by the ArrayAdapter in the ListView
      @Override
      public String toString() {
        return message;
      }
}

问题是String body = msg.substring(msg.lastIndexOf(":")+1, msg.length());此代码触发时的值未更新到列表视图bodyarr.add(body); arrayAdpt.notifyDataSetChanged();。此代码可以在 SMSReceiverActivity 类中找到。

这在我添加 sqlite 代码之前有效。

4

1 回答 1

2

你的List里面Adapter持有Message类型的对象,你里面的字段的类型ActivityList<String>. 您将 a 传递List<Message>Adapterin onCreate(),然后onReceive()将 a 添加StringList<String>. 因此,首先,这两个列表的类型不兼容,因此您将无法将 a 传递List<String>Adapter. 其次,通过调用bodyarr.add(body)您将一个项目添加到 的Activity's列表中Strings,这不会Adapter以任何方式影响 。因此,您可能应该从修复类型不兼容开始,然后不要忘记adapter.setItems(bodyarr)在此列表中添加内容后调用以更新Adapter. 然后调用adapter.notifyDataSetChanged()将完成这项工作。希望这可以帮助。

于 2013-04-10T06:13:39.380 回答