android - 为什么我的 Android ListView 选择了多个项目?

标签 android listview android-arrayadapter

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

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

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

image01 image02

这是我的 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,但第一个和最后一个项目也被设置了!这是怎么回事!?

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

谢谢。

最佳答案

您需要为所有位置提供未选择的图像,除了您想要在您的情况下选择的位置 2.调用 BaseAdapternotifyDataSetChange 以在单击后刷新 ListView ListItem 或所选项目。

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

关于android - 为什么我的 Android ListView 选择了多个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34985815/

相关文章:

Android - 获取当前播放歌曲的持续时间和耗时

Java for Android - 读取文本文件并在列表中显示数据

android - textview 何时在 android 中的数组适配器内获取宽度?

Android - 更新后列表返回顶部

java - 如何在 6.0 Genymotion 设备上安装 Google Play 服务?

android - 抽屉导航中的背景图像和 ImageView

android - 在同一 fragment 中合并 Map 和 ListView

android - 如何删除android中的自定义 ListView 项?

android - 如何将音频文件复制到另一个文件

WPF ListView 数据绑定(bind)拖/放自动滚动