-1

这是一个应该从手机中获取联系人并在列表视图中列出具有电话号码的应用程序。但是当 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();

    }
4

2 回答 2

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();
于 2013-05-08T00:18:40.073 回答
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”。但在我的例子中,光标的索引似乎是崩溃的原因,即使我恢复了它。但我不介意,只要上述工作和运行稳定(也许它效率低下)。

于 2019-01-01T16:16:11.243 回答