2013-06-05 3 views
0

db (SimpleCursorAdapter)로 채워지는 내 응용 프로그램의 listview에서 다중 선택을 사용하고 있습니다. 목록보기 선택에 이상한 동작이 있습니다.ListView 비 선택된 항목 선택

데이터베이스에 7 개 이상의 항목이있는 경우 목록보기에서 첫 번째 항목을 선택하면 여덟 번째 항목을 선택하지 않을 때도 여덟 번째 항목이 선택되고 그 반대의 경우도 마찬가지입니다. 9 번째 항목을 선택하면 두 번째 행이 선택됩니다.

여기가 어떻게됩니까?

코드 :

String[] projection = { ..table_columns..}; 

String[] from = { table_columns..}; 
Cursor cursor = contentResolver.query(SomeContentProvider.CONTENT_URI, projection, null, null, 
     null); 

// the XML defined views which the data will be bound to 
int[] to = new int[] { 
R.id.color, 
R.id.name, 
R.id.desc, 
}; 


// create the adapter using the cursor pointing to the desired data 
//as well as the layout information 
dataAdapter = new SimpleCursorAdapter(
this, R.layout.layout_main, 
cursor, 
from, 
to, 
0); 

dataAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() { 
@Override 
    public boolean setViewValue(View view, Cursor cursor, int column) { 
     int nNameIndex = cursor.getColumnIndexOrThrow(EventsTable.COLUMN_NAME); 
     if(column == nNameIndex){ 
      TextView nname = (TextView) view; 
      String name = cursor.getString(cursor.getColumnIndex(EventsTable.COLUMN_NAME)); 

      String formatted_name = "NAME: " +name; 

      nname.setText(formatted_name); 
      return true; 
     } 
     return false; 
    } 
}); 

    listView.setAdapter(dataAdapter); 
    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    listView.setOnItemLongClickListener(new OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> av, View v, int pos, long id) { 

      if (!listView.isItemChecked(pos)){ 
       listView.setItemChecked(pos, true); 
       v.setBackground(getResources().getDrawable(R.drawable.listview_bg_selected)); 
       v.setSelected(true); 

      } else { 
       listView.setItemChecked(pos, false); 
       v.setBackground(getResources().getDrawable(R.drawable.listview_bg)); 
       v.setSelected(false); 
      } 

      if (listView.getCheckedItemCount() > 0) { 

       if (mMode == null) { 
        mMode = startActionMode(new ActionModeCallback()); 
       } else { 
        mMode.setTitle(listView.getCheckedItemCount() + " " + "Selected"); 

       } 
      } else { 
       if (mMode != null) { 
        mMode.finish(); 


       } 
      } 

      return true; 
     } 
    }); 

답변

1

나는 어댑터의 당신의 Bindview에 해당 항목이 선택된 경우 확인하고 적절하게 배경을 변경하지 않기 때문에 그것의 생각한다.

조회수가 재활용 중입니다.

그래서 당신은, 스크롤 및 항목을 하나의보기에서 이동하고 선택한 말할 때, 항목 1에 대한보기

가 SO보기 바인더이 같은 추가 항목 (8)에 대한 재사용

 int post = cursor.getPosition(); 
     if (!listView.isItemChecked(pos)){ 
       v.setBackground(getResources().getDrawable(R.drawable.listview_bg_selected)); 

     } else { 
       v.setBackground(getResources().getDrawable(R.drawable.listview_bg)); 
     } 
+0

항목을 선택하면 bindView를 어떻게 체크인합니까? 제 코드를 확인하십시오, 그것을 업데이트했습니다. 커스텀'SimpleCursorAdapter' – input

+0

코드 예제를 사용하고 있지 않습니다. 코드는 백그라운드에서 배경을 설정하는 것과 유사합니다. 상태를 확인하고 데이터를 기반으로 상태를 설정 또는 설정 해제하십시오. 재활용보기가 선택 사항을 반영하도록보기를 설정했기 때문에 설정을 해제하는 것이 매우 중요합니다. –

+0

덕분에 매력처럼 작동했습니다. 그러나 이상하게도, 나는 스타일을 잃어 버렸다. – input