Android CheckedTextView位置错误

Android CheckedTextView位置错误,android,listview,checkedtextview,Android,Listview,Checkedtextview,我试着点击一下 我正在尝试实现一个使用状态选择器的列表。 但是我在使用textView.setChecked(textView.isChecked()!)时遇到问题 “已检查”不正确 例如,尝试选择数字0或倒数第二个位置,最后一个也被选中,这是不正常的 我放了一张图片 列表在适配器中,我认为适配器重置了下面项目的位置,这是我能找到他的唯一解释 在我的列表活动中: setListAdapter(new ListMultiplesAdapter(this,R.layout.test12, val

我试着点击一下 我正在尝试实现一个使用状态选择器的列表。 但是我在使用textView.setChecked(textView.isChecked()!)时遇到问题

“已检查”不正确

例如,尝试选择数字0或倒数第二个位置,最后一个也被选中,这是不正常的

我放了一张图片

列表在适配器中,我认为适配器重置了下面项目的位置,这是我能找到他的唯一解释

在我的列表活动中:

 setListAdapter(new ListMultiplesAdapter(this,R.layout.test12, values,listview));
        final ListView listView = getListView();
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
我的适配器:

public ListMultiplesAdapter(Context mContext, int layoutResourceId, String[] data, ListView lv) {

    super(mContext, layoutResourceId, data);

    this.layoutResourceId = layoutResourceId;
    this.mContext = mContext;
    this.data = data;
    this.lv = lv;
}

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
                SparseBooleanArray sparseBooleanArray = lv.getCheckedItemPositions();
                System.out.println("Clicked Position := "+position +" Value: "+sparseBooleanArray.get(position));

                CheckedTextView textView = (CheckedTextView)view.findViewById(R.id.check);
                textView.setChecked(!textView.isChecked());

            }
        });
公共ListMultipleAdapter(上下文mContext、int-layoutResourceId、字符串[]数据、ListView lv){ super(mContext、layoutResourceId、data); this.layoutResourceId=layoutResourceId; this.mContext=mContext; 这个数据=数据; this.lv=lv; } lv.setOnItemClickListener(新的AdapterView.OnItemClickListener(){ @凌驾 public void onItemClick(AdapterView父对象、视图、整型位置、长id){ SparseBooleanArray SparseBooleanArray=lv.getCheckedItemPositions(); System.out.println(“单击的位置:=”+Position+“值:”+sparseBooleanArray.get(位置)); CheckedTextView textView=(CheckedTextView)view.findViewById(R.id.check); textView.setChecked(!textView.isChecked()); } });
这是BaseAdapter实现的一个示例

public class DemoListAdapter extends BaseAdapter {
...
...

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ListItem item = mList.get(position);
        ViewHolder holder;

        // If it is a new item, create it otherwise use the existing item previously created in
        // this method.
        if (convertView == null) {

            LayoutInflater li = (LayoutInflater) mContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = li.inflate(R.layout.list_item, null);

            holder = new ViewHolder();

            // This is where the text is originally set
            holder.mListItemText = (TextView) convertView.findViewById(R.id.list_item_title);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        // use the existing data from the item that already exists
        holder.mListItemText.setText(item.getItemText());


        return convertView;
    }

private static class ViewHolder {
        public TextView mListItemText;

    }
...
...
}

然后,当您滚动时,您可以重新使用列表中的现有项。

首先,您应该使用自定义列表视图,以便自定义列表适配器的功能。你可以参考安卓博客


您可以使用来保持选中项目的位置,并在
getView()
方法中使用此数据使用适配器的位置来选中或取消选中项目。简而言之,您必须在listview中保留选中项和未选中项的所有位置,并使用viewholder重复使用视图。

为此,您必须保存复选框的位置。您需要实现一个适配器,在项目从屏幕上滚出时不会重新创建项目。是的,我使用的是listview,我怎么不能再创造,我更新了我的代码“setListAdapter”。您必须覆盖适配器类中getView方法的实现。您必须创建Holder问题是我使用“ArrayAdapter”第二步将listview我的“ListActivity”。我的代码很好,当“lv.setOnItemClickListener”在我的ListActivity上运行时,它可以工作,但不要将它放在这里,因为检查不起作用,并且在我的适配器中存在checksArrayAdapter extends BaseAdapter的问题。只需在对象中存储一个选中/未选中的标志。如果未选中TextViews,则认为问题不是我的问题。您需要将onClickListener附加到列表中的每个视图。这是一些教程,它们现在有点老了,但仍然有不同场景的很好示例。