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

为什么我的Android ListView选择了多个项目?,android,listview,android-arrayadapter,Android,Listview,Android Arrayadapter,我正在用Android制作一个简单的列表视图,它显示为一个对话框。它的目的是让用户选择一个将被保存为SharedReference的项目。下次用户打开同一个列表时,我希望他们上次选择的项目高亮显示 我的问题是,当我使用ArrayAdapter创建列表时,挑出他们上次选择的索引,然后应用自定义绘图作为背景以显示项目当前已保存,ListView将3个项目显示为“已选择”。它总是第一个项目、最后一个项目和我想要选择的项目 这是一张显示发生了什么的图片 这是我的ArrayAdapter的代码。我正在使

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

我的问题是,当我使用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;
     }
 }
公共类适配器颜色扩展ArrayAdapter{
私人语境;
私有项[]对象;
私人内部布局资源;
私有静态类视图持有者{
图像视图图标;
文本视图颜色;
}
公共适配器颜色(上下文、int资源、ColorItem[]对象){
超级(上下文、资源、对象);
this.context=上下文;
this.layoutResource=资源;
this.objects=对象;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ColorItem ColorItem=getItem(位置);
持票人持票人;
if(convertView==null){
viewHolder=新的viewHolder();
LayoutInflater充气器=LayoutInflater.from(getContext());
convertView=充气机。充气(布局资源,父项,false);
viewHolder.icon=(ImageView)convertView.findViewById(R.id.ImageView_图标);
viewHolder.color=(TextView)convertView.findViewById(R.id.TextView\u item\u name);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
viewHolder.icon.setImageResource(colorItem.getColorIconId());
viewHolder.color.setText(colorItem.getColorName());
如果(位置==2){
convertView.setBackgroundResource(R.drawable.list\u item\u selected);
}
返回视图;
}
}
R.drawable.list_选中的项目是我的自定义可绘制项目

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

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


谢谢。

您需要为所有位置提供未选择的图像,但您希望在案例中作为选定位置的位置2除外。单击ListItem或所选项目后,调用
BaseAdapter
notifyDataSetChange
,以刷新listview

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

为if添加else部分并设置未选择的背景。。这么简单的解决方案。。。谢谢我喜欢@user3676184在if语句中使用else。但这两种方法都有效=]