Android CheckedTextView位置错误

时间:2015-05-06 10:17:24

标签: android listview checkedtextview

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

" isChecked"没有正确

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

我放了一张图片。

列表位于适配器内,我认为适配器会重置下面项目的位置,这是我能找到他的唯一解释。

enter image description here

在我的ListActivity中:

 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());

            }
        });

2 个答案:

答案 0 :(得分:0)

这是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;

    }
...
...
}

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

答案 1 :(得分:0)

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

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