2014-06-20 3 views
0

내 사용자 지정 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(); 
    } 
} 

답변

2

한번에 지우기 배열입니다. 이것은 클래스 변수 gridArray을 사용하고 있기 때문일 수 있습니다. 새 데이터 집합을 추가하기 전에 모든 요소를 ​​제거하는 첫 번째 줄을 확인하십시오.

+0

아,이 부분이 수정되었습니다. 고맙습니다! – Anubis

0

아마도 retrieveCurrentGoals()으로 전화를 걸면 항상 데이터베이스의 모든 행을 읽고이를 gridArray에 첨부하기 때문에 발생합니다.

처음에 당신은 두 번째에서 첫 번째 항목, 을 추가 한 당신은 당신의 clear 방법

0

가합니까 arrayList 전에 설정 새로운 데이터 호출 가능한 해결책의 하나로서

제 초 등 추가 Cursor in getGoalData() 예상 길이 (이전 길이 +1)가 있습니까?

CursorLoader 클래스를 사용하고 또는 FragmentLoaderCallbacks을 구현하는 것이 좋습니다.

0

데이터를 추가하기 전에 어레이를 정리해야합니다. 떠나고 다시 현재 활동이나 조각으로 와서 매번 귀하의 배열에 데이터를 추가 할 때마다 thats 이유는 당신이 데이터를 추가하기 전에 귀하의 gridarray 및 목표 데이터를 정리 dublicate 데이터를 받고 있습니다. 그게 전부 야.