这是一个应该从手机中获取联系人的应用程序,并列出列表视图中具有电话号码的应用程序。 但是当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();
}
答案 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”。但是在我的示例中,游标的索引似乎是崩溃的原因,即使我恢复了它。但是我不介意,只要以上各项能够稳定运行并运行(也许效率不高)。