Android Can';无法为ListView添加值

Android Can';无法为ListView添加值,android,sqlite,Android,Sqlite,我的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.Inte

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

}
问题是
String body=msg.substring(msg.lastIndexOf(“:”)+1,msg.length())的值bodyarr.add(body)时,code>未更新到listview;arrayAdpt.notifyDataSetChanged()。此代码可以在SMSReceiverActivity类中找到


这在我添加sqlite代码之前就起作用了。

适配器中的
列表
包含
消息
类型的对象,而
活动
中的字段类型是
列表
。在
onCreate()
中将
列表
传递给
适配器
,然后
onReceive()
字符串
添加到
列表
。因此,首先,这两个列表的类型不兼容,因此您无法将
列表
传递给
适配器
。第二,通过调用
bodyarr.add(body)
,您正在将一项添加到
活动的
字符串列表中,这不会以任何方式影响
适配器。因此,您可能应该从修复类型不兼容开始,然后在添加此列表中的内容以更新
适配器中的数据后,不要忘记调用
adapter.setItems(bodyarr)
。然后调用
adapter.notifyDataSetChanged()
将完成此任务。希望这有帮助

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

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