使用BaseAdapter for ListView时无法更新数据库的光标

时间:2014-11-03 17:18:33

标签: android database sqlite listview android-listview

经过许多教程后,我在我的Android应用程序中成功实现了数据库,除了一件事,一切正常。我的应用程序构建为接收文本消息(SMS)并将它们存储在数据库中,并在ListView上填充它们。当应用程序收到消息时,数据库会更新,但列表视图不会在该实例中更新,但在重新启动应用程序后,列表视图将填充数据库中的所有接收数据。请帮我解决这个问题。 这是我的代码片段: 主要课程

    import android.os.Bundle;
    import android.widget.ListView;
    import com.example.bhash.database.Adapter;
    import com.example.bhash.database.MessageData;
    import com.example.bhashsms.adapters.DrawerAdapter;
    import com.jeremyfeinstein.slidingmenu.lib.app.SlidingActivity;

    public class Main extends SlidingActivity {
        ListView dList, mList;
        DrawerAdapter dAdapter;
        static MessageData db;
        static Adapter adapter;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            setBehindContentView(R.layout.drawer);
            init();
            db = new MessageData(Main.this);

            adapter = new Adapter(this);
            mList.setAdapter(adapter);

        }

        private void init() {
            getSlidingMenu().setBehindOffset(100);
            dList = (ListView) findViewById(R.id.drawerlist);
            mList = (ListView) findViewById(R.id.mainlist);
        }

        public static void update(String number, String body) {
            // adapter.list.add(new Person_Data(number, body));
            try {

                db.open();
                db.createEntry(number, body);
                db.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            adapter.notifyDataSetChanged();

        }

    }

databasehelper class:

    public class MessageData {

        public static final String KEY_ROWID = "_id";
        public static final String KEY_NUMBER = "phone_number";
        public static final String KEY_MESSGAE = "message";

        private static final String DATABASE_NAME = "Message";
        private static final String DATABASE_TABLE = "SMS";
        private static final int DATABASE_VERSION = 1;
        private Helper helper;
        private Context ourContext;
        private SQLiteDatabase ourDatabase;

        public MessageData(Context c) {
            // TODO Auto-generated constructor stub
            ourContext = c;

        }

        private static class Helper extends SQLiteOpenHelper {

            public Helper(Context context) {
                super(context, DATABASE_NAME, null, DATABASE_VERSION);
                // TODO Auto-generated constructor stub
            }

            @Override
            public void onCreate(SQLiteDatabase db) {
                // TODO Auto-generated method stub
                try {
                    db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID
                            + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_NUMBER
                            + " TEXT NOT NULL, " + KEY_MESSGAE + " TEXT NOT NULL);");
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                // TODO Auto-generated method stub
                try {
                    db.execSQL("DROP TABLE IF EXIST " + DATABASE_TABLE);
                    onCreate(db);
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }

        public MessageData open() {
            helper = new Helper(ourContext);
            ourDatabase = helper.getWritableDatabase();
            return this;
        }

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

        public long createEntry(String number, String message) {
            ContentValues cv = new ContentValues();
            cv.put(KEY_NUMBER, number);
            cv.put(KEY_MESSGAE, message);
            return ourDatabase.insert(DATABASE_TABLE, null, cv);

        }

        public List<Person_Data> getData() {
            String[] columns = new String[] { KEY_ROWID, KEY_NUMBER, KEY_MESSGAE };
            Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null,
                    null, null);

            // int iRow = c.getColumnIndex(KEY_ROWID);
            int iNumber = c.getColumnIndex(KEY_NUMBER);
            int iMessage = c.getColumnIndex(KEY_MESSGAE);
            Log.i("coaunt value",c.getCount()+"");
            List<Person_Data> list = new ArrayList<Person_Data>();
            c.moveToFirst();

            for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {

                list.add(new Person_Data(c.getString(iNumber), c
                        .getString(iMessage)));

            }
            c.close();
            return list;

        }

    }

Adapterclass:

    public class Adapter extends BaseAdapter {
        Context c;
        LayoutInflater inflaterr;
        public List<Person_Data> list = new ArrayList<Person_Data>();


        public Adapter(Context c) {
            this.c = c;
            MessageData md = new MessageData(c.getApplicationContext());
            md.open();
            Person_Data datatData;
            list = md.getData();
            Log.i("dasdasdad", list.size()+"");
            md.close();
            inflaterr = LayoutInflater.from(this.c);
            // TODO Auto-generated constructor stub
        }
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            ViewHolder holder = null;
            View singleview = convertView;
            if (convertView == null) {

                singleview = inflaterr.inflate(R.layout.main_list_view, parent,
                        false);
                holder = new ViewHolder(singleview);
                singleview.setTag(holder);
            }

            else {
                holder = (ViewHolder) singleview.getTag();

            }
            final Person_Data data = list.get(position);
            holder.Number.setText(data.Number);
            holder.callme.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    ExtractNumber(data.Message);

                }

                private void ExtractNumber(String src) {
                    StringBuilder builder = new StringBuilder();
                    int j = src.length();
                    for (int i = 0; i < j; i++) {
                        char c = src.charAt(i);
                        if (c == '+') {
                            builder.append(c);
                            for (int k = i; k < j; k++) {
                                char r = src.charAt(k);
                                if (!Character.isDigit(r)) {
                                    i = k;
                                    break;
                                }
                                builder.append(r);
                            }
                            if (builder.toString().length() > 8
                                    && builder.toString().length() < 14)
                                break;
                        }
                    }

                    Intent callIntent = new Intent(Intent.ACTION_CALL);
                    callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    callIntent.setData(Uri.parse("tel:" + builder.toString()));
                    c.startActivity(callIntent);
                }

            });
            return singleview;
        }

        class ViewHolder {
            TextView Number, time;
            ImageView callme;

            public ViewHolder(View v) {
                // TODO Auto-generated constructor stub
                Number = (TextView) v.findViewById(R.id.rNum);
                callme = (ImageView) v.findViewById(R.id.callbutton);

            }
        }
    }

0 个答案:

没有答案