내 사용자 지정 BaseAdapter 구현에서 지원하는 ListView가 있으며 그 뒤에 데이터베이스가 있습니다. 데이터베이스에 항목을 처음 삽입하면 모든 것이 정상입니다. 그러나 다른 항목을 추가하면 ListView에서 갑자기 2 대신 3 개의 항목이 표시됩니다. 다른 항목을 추가하면 ListView가 업데이트되고 갑자기 5 개의 항목이 표시됩니다. 뒤로 버튼을 누르고 이전 활동으로 돌아가서 ListView 활동을 다시 시작하면 항목 수가 다시 표시됩니다. 그래서 내 ListView 또는 내 어댑터가 제대로 업데이 트되고 있지 않지만 어디서 잘못되는지 볼 수 없습니다. 나는 도움을 많이 주셔서 감사합니다.중복 요소를 표시하는 ListView 및 BaseAdapter 구현
내 코드 : 당신이 처음은 완벽하지만 두 번째 검색하고 중복 값을주고 시작에 말했듯이 새로운 요소
private void retrieveCurrentGoals(){
gridArray.clear();
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();
}
를 추가하기 전에
@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();
}
}
아,이 부분이 수정되었습니다. 고맙습니다! – Anubis