0

我的应用程序中有一个自定义列表视图,我想在其中使用 actionmode 实现删除多个元素。一个人可以通过长按一个项目来激活动作模式来选择多个项目,就像在 watsapp 中发生的那样。我可以选择多个项目,但我面临的问题是在更改所选列表项的背景时。我尝试了激活和选择模式,但它们正在更改我的列表项中随机元素的背景。滚动列表会改变随机项目的背景,并且它们在每次滚动时都会发生变化。我观察到的奇怪的事情。

我尝试以编程方式或使用 xml 更改背景,但在这两种情况下都发生了同样的事情。

我已应用于列表视图项目视图顶部元素的可绘制文件的代码

<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:state_pressed="true" android:drawable="@android:color/transparent"></item>
 <item android:state_selected="true" android:drawable="@android:color/transparent">   </item>
 <item android:state_focused="true" android:drawable="@android:color/transparent"></item>
 <item android:state_activated="true" android:drawable="@color/holored"></item>
 <item android:drawable="@drawable/list_view_item_shadow"></item>
</selector>

列表视图中的长按监听器

detailsListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> adapterView, View view, int  position, long id) {

            view.setActivated(true);
            onListItemSelect(position, view);
            return true;
        }
    });



private void onListItemSelect(int position,View view) {

    trasactionDetailAdapter.toggleSelection(position,view);

}

我正在使用 SparseBooleanArray 来检查项目选择,mSelectedItemsIds 是我的 SparseBooleanArray 对象。

在我的适配器里面:

public void toggleSelection(int position,View view) {
    selectView(position, !mSelectedItemsIds.get(position), view);
}

public void selectView(int position, boolean value,View view) {

    changeBackgroundColor(view,value);

    notifyDataSetChanged();
}

private void changeBackgroundColor(View view,boolean hasSelectedItem){
    if(hasSelectedItem){

        int color=context.getResources().getColor(R.color.holoblue);
        view.setBackgroundColor(color);
    }else{
        view.setBackgroundResource(R.drawable.listview_item_backgroundstate);
    }

}

但即使我长按列表中的一项,此代码也会更改列表视图中多个随机项目的背景颜色,我是否传递了错误的视图来更改背景?

4

2 回答 2

0

为此使用 getter setters 类。在单击项目时将您的条件放入 getter setter 中,然后根据要求通知适配器并设置 convertView 的背景。

于 2013-10-22T13:20:52.247 回答
0

您收到的视图onItemLongClick正在重复用于列表中的不同项目。这是适配器用作性能优化的一种方法,可防止为列表中的每个项目创建新视图。话虽这么说,您不想对您在那里收到的视图执行该操作。相反,您可能希望通过传递给方法的位置或 id 来检索项目。这是一个例子。

MyItem item = (MyItem) detailsListView.getAdapter().getItem(position);
item..setActive(true);

在您的适配器中,您可以让它检查item.isActive()并基于此以不同的方式绘制视图。

public class MySimpleArrayAdapter extends ArrayAdapter<MyItem> {
  private final MyItem[] values;

  public MySimpleArrayAdapter(Context context, MyItem[] values) {
    super(context, R.layout.rowlayout, values);
    this.values = values;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
   ...
   MyItem item = values[position];
   if(item.isActive()) {
    //Do your drawing here
   }
  }
} 
于 2013-10-21T19:35:23.980 回答