ListView未选中的项目被选中

时间:2013-06-05 22:33:23

标签: android listview

我正在我的应用程序的listview上使用多个选择,这些选择由db(SimpleCursorAdapter)填充。列表视图选择有一些奇怪的行为。

如果数据库中有超过7个项目,如果我选择列表视图中的第1个项目,即使我没有选择第8个项目也会选择第8个项目,反之亦然。如果我选择第9项,则第2行被选中。

这里发生了什么?

代码:

  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 个答案:

答案 0 :(得分:1)

我怀疑是因为在你的适配器的bindView中你没有检查项目是否被选中,然后正确地改变背景。

您正在体验您的观点。

因此,当您滚动并说第一项不在视图中并被选中时,第1项的视图将重复用于第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));
       }