【问题标题】:Change background of multiple selected item in android custom listview在android自定义列表视图中更改多个选定项目的背景
【发布时间】:2013-10-21 18:54:54
【问题描述】:

我的应用中有一个自定义列表视图,我想在其中使用 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 是我的对象 稀疏布尔数组。

在我的适配器内部:

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);
    }

}

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

【问题讨论】:

标签: android


【解决方案1】:

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

【讨论】:

  • 如何获得需要在Adapter中更改的视图背景?
  • 改变背景列表视图中所有列表元素的背景,毫无疑问会这样。
【解决方案2】:

您在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
   }
  }
} 

【讨论】:

  • 列表视图中不存在名称为getListAdapter() 的此类方法。我正在使用SherlockActivity 的子类来显示列表视图。
  • 在这种情况下,您可以只使用 detailsListView.getAdapter()。我会更新我的答案。
  • 上面的代码给了我与行关联的项目而不是视图,所以我不能在项目上调用 setActivated 方法,它是视图的函数。
  • 我的意思是你可以在项目上创建方法。您可以随意命名该方法。此解决方案还允许您将视图的绘图保留在适配器中。检查适配器中的值并相应地绘制视图。
  • 我不是你说的,如果可以请提供一些示例代码。因为我尝试了所有可能的方法来做同样的事情。
猜你喜欢
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
相关资源
最近更新 更多