为啥我的 Android ListView 选择多个项目?

Posted

技术标签:

【中文标题】为啥我的 Android ListView 选择多个项目?【英文标题】:Why is my Android ListView selecting multiple items?为什么我的 Android ListView 选择多个项目? 【发布时间】:2016-05-01 08:41:04 【问题描述】:

我正在 android 中制作一个简单的 ListView,它显示为一个对话框。其目的是让用户选择将保存为 SharedPreference 的项目。下次用户打开同一个列表时,我希望他们上次选择的项目被突出显示。

我的问题是,当我使用我的 ArrayAdapter 创建列表时,挑出他们上次选择的索引,然后应用自定义可绘制对象作为背景以显示该项目当前已保存,ListView 将 3 个项目显示为“已选择” .它始终是第一个项目、最后一个项目以及我想要选择的项目。

这是一张显示正在发生的事情的图片

这是我的 ArrayAdapter 的代码。我正在使用 ViewHolder 模式。

public class AdapterColors extends ArrayAdapter<ColorItem> 
     private Context context;
     private ColorItem[] objects;
     private int layoutResource;

     private static class ViewHolder 
         ImageView icon;
         TextView color;
     

     public AdapterColors(Context context, int resource, ColorItem[] objects) 
         super(context, resource, objects);
         this.context = context;
         this.layoutResource = resource;
         this.objects = objects;
     

     @Override
     public View getView(int position, View convertView, ViewGroup parent) 
         ColorItem colorItem = getItem(position);
         ViewHolder viewHolder;

         if (convertView == null) 
             viewHolder = new ViewHolder();
             LayoutInflater inflater = LayoutInflater.from(getContext());
             convertView = inflater.inflate(layoutResource, parent, false);
             viewHolder.icon = (ImageView) convertView.findViewById(R.id.imageview_icon);
             viewHolder.color = (TextView) convertView.findViewById(R.id.textview_item_name);
             convertView.setTag(viewHolder);
          else 
             viewHolder = (ViewHolder) convertView.getTag();
         

         viewHolder.icon.setImageResource(colorItem.getColorIconId());
         viewHolder.color.setText(colorItem.getColorName());

         if(position == 2) 
             convertView.setBackgroundResource(R.drawable.list_item_selected);
         

         return convertView;
     
 

R.drawable.list_item_selected 是我的自定义可绘制对象。

作为测试,我只选择了 2 的位置,正如您在 getView() 方法中看到的那样。位置 2 的项目正确地设置了它的 backgroundResource,但第一个和最后一个项目也被设置了!这是怎么回事!?

如果有人需要查看任何其他代码,我很乐意更新我的问题。

谢谢。

【问题讨论】:

为您的 if 添加 else 部分并设置未选择的背景 【参考方案1】:

您需要为除您希望在您的情况下选择的位置 2 之外的所有位置提供未选择的图像。单击 ListItem 或 Selected 项后,调用 notifyDataSetChangeBaseAdapter 以刷新列表视图。

@Override
     public View getView(int position, View convertView, ViewGroup parent) 
         ColorItem colorItem = getItem(position);
         ViewHolder viewHolder;

         if (convertView == null) 
             viewHolder = new ViewHolder();
             LayoutInflater inflater = LayoutInflater.from(getContext());
             convertView = inflater.inflate(layoutResource, parent, false);
             viewHolder.icon = (ImageView) convertView.findViewById(R.id.imageview_icon);
             viewHolder.color = (TextView) convertView.findViewById(R.id.textview_item_name);
             convertView.setTag(viewHolder);
          else 
             viewHolder = (ViewHolder) convertView.getTag();
         

         viewHolder.icon.setImageResource(colorItem.getColorIconId());
         viewHolder.color.setText(colorItem.getColorName());
// need to give image for unselected state too.inplace of below line you can give below line in else part of positioin== 2 condition
convertView.setBackgroundResource(R.drawable.list_item_unSelectedImage);
         if(position == 2) 
             convertView.setBackgroundResource(R.drawable.list_item_selected);
         


         return convertView;
     

【讨论】:

哇......这么简单的解决方案......谢谢!我喜欢@user3676184 在我的 if 语句中使用 else 的想法。两种方法都有效 =]

以上是关于为啥我的 Android ListView 选择多个项目?的主要内容,如果未能解决你的问题,请参考以下文章

Android:如果同一活动中有多个 ListView,为啥我看不到 ListView?

为啥我的 ListView 项目重叠而不是滚动?

为啥我的 ListView 使我的应用程序崩溃而不是列出我的条目?

Android ListView多布局讲解

Android ListView多布局讲解

Android学习笔记ListView