当我调用mAdaper.notifyDataSetChanged()时,Android应用程序崩溃;

时间:2013-05-08 00:16:43

标签: android

这是一个应该从手机中获取联系人的应用程序,并列出列表视图中具有电话号码的应用程序。 但是当mAdaper.notifyDataSetChanged()时应用程序崩溃了;叫做 :/ 请帮忙。

public class MainActivity extends Activity{
    static int num = 0;

    ListView lv;
    ArrayAdapter<String> mAdaper;
    ArrayList<String> contacts = new ArrayList<String>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        getContacts();

        lv = (ListView)findViewById(R.id.listView1);
        mAdaper = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contacts);

        lv.setAdapter(mAdaper);

    }

    private void getContacts(){

        ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, // projection,
                null, // selection,
                null, // selectionArgs,
                "_ID DESC" // sortOrder
        );

        if (cur.getCount() > 0) {
            while (cur.moveToNext() && num < 10) {
                String id = cur.getString(cur
                        .getColumnIndex(ContactsContract.Contacts._ID));
                String name = cur
                        .getString(cur
                                .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                if (Integer
                        .parseInt(cur.getString(cur
                                .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {

                    // TableRow row = new TableRow(this);
                    TextView tv = new TextView(this);
                    String row = id + " - " + name;
                    contacts.add(row);
                    //mAdaper.add(row);
                    num++;

                }
            }
        }
        mAdaper.notifyDataSetChanged();

    }

2 个答案:

答案 0 :(得分:1)

在初始化mAdapter之前调用getContacts()。在getContacts()中,您正在调用mAdapter.notifyDataSetChanged();.此时,mAdapter尚未初始化。

初始化mAdapter后调用getContacts()。

lv = (ListView)findViewById(R.id.listView1);
mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contacts);
lv.setAdapter(mAdapter);
getContacts();

答案 1 :(得分:0)

我通过更改数据集后调用onCreate(null)来做到这一点(我认为这很脏)。这样可以完美还原我的回收站:

此崩溃:

    // delete selected items from database
    sqLiteDatabase.execSQL("DELETE FROM country WHERE selected");
    cursor = getDBContent();
    cursor.close();
    mainActivityAdapter.notifyDataSetChanged();

不是:

    // delete selected items from database
    sqLiteDatabase.execSQL("DELETE FROM country WHERE selected");
    cursor = getDBContent();
    cursor.close();
    this.onCreate(null);

我做了一个System.out.println(),并且光标或mainActivityAdapter都不为“ null”。但是在我的示例中,游标的索引似乎是崩溃的原因,即使我恢复了它。但是我不介意,只要以上各项能够稳定运行并运行(也许效率不高)。