【发布时间】:2014-06-20 06:55:24
【问题描述】:
我有一个由我的自定义 BaseAdapter 实现支持的 ListView,它背后有一个数据库。当我第一次将一个项目插入我的数据库时,一切都很好。但是,当我添加另一个项目时,我的 ListView 突然显示 3 个项目而不是 2 个。如果我添加另一个项目,ListView 更新,突然我看到 5 个项目。当我点击后退按钮并返回上一个活动并再次启动 ListView 活动时,它再次显示正确数量的项目。所以我的 ListView 或我的适配器没有正确更新,但我看不出哪里出了问题。非常感谢您的帮助。
我的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.goals_main_screen);
mListView = (ListView) findViewById(R.id.goal_listview);
customGridAdapter = new CustomGridViewAdapter(this, R.layout.card_grid_item, gridArray);
customGridAdapter.registerDataSetObserver(new DataSetObserver(){
@Override
public void onChanged(){
retrieveCurrentGoals();
}
});
mListView.setAdapter(customGridAdapter);
mListView.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
goToDetailedGoalView((int) id);
}
});
retrieveCurrentGoals();
}
private void retrieveCurrentGoals(){
String[] projection = {DatabaseHelper.KEY_ROWID, DatabaseHelper.KEY_GOAL_ID};
Cursor c = getContentResolver().query(MyContentProvider.CONTENT_URI_USER_GOALS, projection, null, null, null);
c.moveToFirst();
for(int i=0; i<c.getCount();i++){
String [] goalData = getGoalData(c.getInt(1));
gridArray.add(goalData);
c.moveToNext();
}
c.close();
}
private String[] getGoalData(int id){
String[] projection = {DatabaseHelper.KEY_GOAL_TITLE, DatabaseHelper.KEY_GOAL_CATEGORY};
String selection = "_id = " + id;
Cursor c = getContentResolver().query(MyContentProvider.CONTENT_URI_GOALS, projection, selection, null, null);
if(c.moveToFirst()){
String[] data = {"", "", ""};
data[0] = c.getString(0);
data[1] = Integer.toString(c.getInt(1));
data[2] = String.valueOf(id);
return data;
}
c.close();
return null;
}
private void goToDetailedGoalView(int id){
Intent i = new Intent(this, GoalCardDetail.class);
i.putExtra(SharedData.GOAL_ID.getValue(), id);
startActivityForResult(i, 0);
}
public void toGoalSelectionScreen(View v){
Intent i = new Intent(this, DisplayCardActivity.class);
startActivityForResult(i,GO_TO_GOAL_CARD_SCREEN);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
if(requestCode == GO_TO_GOAL_CARD_SCREEN && resultCode == RESULT_OK){
System.out.println("ListView holds: " + mListView.getCount());
customGridAdapter.notifyDataSetChanged();
}
}
【问题讨论】:
标签: android android-listview baseadapter