【发布时间】:2014-04-07 19:40:40
【问题描述】:
首先,我想为提出这个问题道歉,因为我知道这里有很多类似的问题,但没有一个答案能解决我的问题。
正如问题的标题所示,当 SQLiteDatabase 中的数据发生变化时,我需要用新项目填充 ListView。
更具体一点...
我有一个在 ListView 中显示联系人的活动。在屏幕底部我有一个添加联系人的按钮(会弹出一个对话框,其中包含姓名、电话号码等字段......)。
当单击列表中的项目时,会打开另一个对话框。在该对话框中,有 3 个按钮用于发送短信(发送至所选联系人)、编辑和删除联系人。
当我填写添加新联系人的表单,或单击删除按钮时,我希望刷新 ListView。
这不会发生。为了查看更新后的列表,我需要返回并再次启动联系人活动。
代码如下:
活动:
public class ContactsActivity extends Activity {
private MyUtilities myUtilities;
private MyDatabaseHelper mdbh;
private AdapterContactListView contactsAdapter;
private ListView contactsListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contacts);
mdbh = new MyDatabaseHelper(this);
myUtilities = new MyUtilities(this);
contactsAdapter = new AdapterContactListView(this,mdbh);
contactsListView = (ListView)findViewById(R.id.contactActivityLV);
contactsListView.setAdapter(contactsAdapter);
contactsAdapter.notifyDataSetChanged();
contactsListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// TODO Auto-generated method stub
TextView phoneNumberTV = (TextView)view.findViewById(R.id.contactElementNumberTV);
String phoneNumber = phoneNumberTV.getText().toString();
Contact contact = mdbh.getContactFromPhoneNumber(phoneNumber);
Dialog d = myUtilities.createSelectedContactOptionsDialog(contact);
d.show();
contactsAdapter.updateAdapter(mdbh.getAllContacts());
}
});
public void addContact(View view) {
Dialog d = myUtilities.createAddContactDialog();
d.show();
contactsAdapter.updateAdapter(mdbh.getAllContacts());
}
}
Adater:
private List<Contact> allContacts;
private int numberOfContacts;
private MyDatabaseHelper mdbh;
private Context context;
public AdapterContactListView(Context c, MyDatabaseHelper m) {
super();
context = c;
mdbh = m;
allContacts = mdbh.getAllContacts();
numberOfContacts = allContacts.size();
}
public void updateAdapter(List<Contact> cs) {
allContacts = cs;
numberOfContacts = allContacts.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View view = convertView;
if (view == null) {
LayoutInflater li = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = li.inflate(R.layout.contact_element, null);
}
String fullName = allContacts.get(position).getFirstName();
fullName = fullName.concat(" ");
fullName = fullName.concat(allContacts.get(position).getLastName());
TextView contactName = (TextView)view.findViewById(R.id.contactElementNameTV);
TextView phoneNumber = (TextView)view.findViewById(R.id.contactElementNumberTV);
contactName.setText(fullName);
phoneNumber.setText(allContacts.get(position).getPhoneNumber());
return view;
}
对话框的工作是对数据库进行操作(更新、添加、删除)。
我尝试将notifyDataSetChanged() 放在updateAdapter() 之后和updateAdapter() 方法本身中,但这些都不起作用。
我想我可能会遗漏一件事:
notifyDataSetChanged() 的定义表示它通知附加的观察者。我没有附加观察员,但在我读过的所有答案中,没有人提到任何关于附加观察员的事情。如果您认为这是问题所在,请告诉我该怎么做。
有人可以解释一下这个问题吗?
提前致谢。
【问题讨论】:
-
不,不,不,不要使用 BaseAdapter,改用 SimpleCursorAdapter
-
很抱歉我的无知,但我尝试的一切都失败了。我的适配器现在扩展了 CursorAdapter。 ListView 填充良好,但问题仍然存在。当我关闭对话框时,列表不会刷新。我仍然需要关闭活动并重新启动它才能看到正确的列表。我在关闭对话框后尝试调用
adapter.changeCursor和adapter.notifyDataSetChanged(因为对话框处理数据库操作)。我尝试在onResume中调用它...但没有。请帮忙!我被困住了。
标签: android listview android-listview baseadapter