【问题标题】:Listview with checkedtextview repeating the checked itemsListview with checkedtextview 重复检查项目
【发布时间】:2015-07-08 16:16:46
【问题描述】:

我已经实现了一个带有自定义 ArrayAdapter 的 ListView,其中每一行都包含一个 CheckedTextView 小部件。当我检查 ListView 的第一项并向下滚动时,我发现 ListView 的其他项目也被检查,并且我向下滚动更多,我发现元素被检查。看起来我检查的第一个孩子如何复制到其他不可见的 listview 孩子。

我知道我们可以选择使用choiceMode,但这不适用于自定义ArrayAdapter,我必须使用自定义ArrayAdapter。 ArrayAdapter的对象类型是String,我在网上找到了自定义模型的例子来维护checkbox标签,但是由于我使用的是String,所以我不能这样做。

我正在粘贴我的适配器代码:

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        final ViewHolderClass viewHolder;

        if(convertView==null)
        {
            LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.disruption_routes_list_child, parent, false);

            viewHolder = new ViewHolderClass();
            initUI(convertView, viewHolder);

            convertView.setTag(viewHolder);
        }
        else
        {
            viewHolder = (ViewHolderClass) convertView.getTag();
        }


        viewHolder.ctvRoutes.setText(alRoutes.get(position));



        viewHolder.ctvRoutes.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                if(viewHolder.ctvRoutes.isChecked())
                {
                    viewHolder.ctvRoutes.setChecked(false);
                }
                else
                {
                    viewHolder.ctvRoutes.setChecked(true);
                }
            }
        });



        return convertView;
    }


        private void initUI(View convertView, ViewHolderClass viewHolder) {
        // TODO Auto-generated method stub
        viewHolder.ctvRoutes = (CheckedTextView) convertView.findViewById(R.id.ctvRoutes);
    }



    static class ViewHolderClass
    {
        CheckedTextView ctvRoutes;


    }

【问题讨论】:

  • 尝试每次都强制初始化新的ViewHolderClass,而不是使用回收的并回发结果。
  • 你检查我的答案了吗

标签: android listview checkbox state checkedtextview


【解决方案1】:

这是因为android列表被回收了

要克服这个问题,您将拥有一个自定义对象来填充列表,您可以在其中提供一个名为 ischecked 的字段,并在您的 getview() 内提供一个字段。

你做以下事情

if(yourlist.get(Position).isChecked())
    viewHolder.ctvRoutes.setChecked(true);
else
    viewHolder.ctvRoutes.setChecked(false);

或者你会提供一个 int 的 arrayList

您的商店检查的位置 在你的getview()里面

检查数组中是否存在位置,使其选中,否则不选中

我有点喜欢第一种方法,因为如果你的数组列表很大,你想在主线程中搜索你的数组,这会使滚动滞后

【讨论】:

    【解决方案2】:

    您必须保存ViewHolder 的状态。然后在convertView == null时设置tag,在else条件下获取。

    检查我的做法:

    public class Conference_listViewAdapter extends ArrayAdapter<Model> {
        Activity context;
        LayoutInflater inflater;
        public static List<Model> data = null;
        ArrayList<String> id_list = new ArrayList<String>();
    
        int pos;
    
    
        public Conference_listViewAdapter(Activity context, List<Model> list, ArrayList<String> id_list) {
            super(context, R.layout.people_list_item1, list);
            this.context = context;
            this.data = list;
            this.id_list = id_list; 
        }
    
    
    
        public View getView(final int position, View convertView, ViewGroup parent) {
            View view = null;       
            if (convertView == null) {
                LayoutInflater inflator = context.getLayoutInflater();
                view = inflator.inflate(R.layout.people_list_item1, null);
                final ViewHolder holder = new ViewHolder();
                holder.title = (TextView) view.findViewById(R.id.tv_name);
                holder.image = (ImageView) view.findViewById(R.id.avtaar);
                holder.favorite = (CheckBox) view.findViewById(R.id.fav);
    
                view.setTag(holder);
    
                holder.favorite.setTag(data.get(position));
    
                holder.favorite.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                    
                        Model element = (Model) holder.favorite.getTag();
                        element.setSelected(buttonView.isChecked());     
                    }
                });
    
    
            } else {
                view = convertView;
                ((ViewHolder) view.getTag()).favorite.setTag(data.get(position));
            }
    
    
    
    
    
            ViewHolder holder = (ViewHolder) view.getTag();     
            holder.favorite.setChecked(data.get(position).isSelected());
            holder.title.setText(data.get(position).getName());
    
            try {
                holder.image.setImageBitmap(openPhoto(Long.valueOf(id_list.get(position))));
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return view;
        }
    
    
    
    
        static class ViewHolder {
            protected TextView title;
            protected CheckBox favorite;
            ImageView image;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      相关资源
      最近更新 更多