jaypabs
jaypabs

Reputation: 1567

Can't Add Value to ListView

I have the following code on my 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);
    }

}

And this is the code of 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;
      }

}

And here's the Message.java code:

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

The problem is the value of String body = msg.substring(msg.lastIndexOf(":")+1, msg.length()); is not updating to the listview when this code fire bodyarr.add(body); arrayAdpt.notifyDataSetChanged();. This code can be found in SMSReceiverActivity class.

This is working before I added a sqlite code.

Upvotes: 2

Views: 293

Answers (1)

Egor
Egor

Reputation: 40203

The List inside your Adapter holds objects of Message type, and the type of the field inside your Activity is List<String>. You're passing a List<Message> to the Adapter in onCreate(), and then onReceive() you're adding a String to the List<String>. So first, those two lists have incompatible types, so you won't be able to pass a List<String> to the Adapter. And second, by calling bodyarr.add(body) you're adding an item to the Activity's list of Strings, which doesn't affect the Adapter in any way. So you should probably start with fixing the type incompatibility, and then don't forget to call adapter.setItems(bodyarr) after you add something in this list to update the data inside the Adapter. Then calling adapter.notifyDataSetChanged() will do the job. Hope this helps.

Upvotes: 2

Related Questions