0

我有一个带有项目布局的自定义列表视图,左侧有一个复选框和 4 个文本视图,很像 astrid 任务管理器。 在此处输入图像描述

我打算做的是在单击复选框时,文本视图必须更新它们的值。起初,我的问题是,在位置 1 选中复选框时,会在滚动时选中末尾或其他地方的复选框。在寻找解决方案时,我开始了解listview中的视图回收。我应用了像 viewholder 这样的概念,现在我能够保持复选框的状态。但是,在复选框单击时,我更改了文本视图并且更改不会持续存在,这意味着任何随机电视也显示相同的更改。

我在我的适配器中应用了一个复选框 onclicklistener。任何想法如何实现它?

4

2 回答 2

0

您将希望在项目数据中而不是在视图持有者中保留项目的状态。视图持有者只是视图的一种便利,假设您回收视图,它会在不同时间显示许多不同的项目。在数据绑定期间,您需要绑定显示项目所需的所有状态,以避免随机数据出现在另一个列表项的视图中。

public class MyListAdapter extends BaseAdapter {

    // ....

    @Override
    View getView(final int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            view = inflate(R.layout.my_list_item_layout, parent, false);

            // View holder just prevents having to look up these values 
            // every time the view is reused.
            MyViewHolder holder = new MyViewHolder();
            holder.checkbox = (CheckBox) view.findViewById(R.id.check_box);
            holder.textview = (TextView) view.findViewById(R.id.text_view);
            view.setTag(holder);
        }

        final MyViewHolder holder = (MyViewHolder) view.getTag();
        final MyData data = (MyData) getItem(position);
        holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                data.savedCheckboxState = isChecked;
                // now tell the view to rebind the data
                notifyDataSetChanged();
            }
        });

        holder.checkbox.setChecked(data.savedCheckboxState);
        holder.textview.setText(String.valueOf(data.savedCheckboxState));
        return view;
    }

    private static class MyViewHolder {
        CheckBox checkbox;
        TextView textview;
    }
}
于 2013-09-20T10:15:16.987 回答
0

您可以在这里参考我的完整代码,您可以做的是,将复选框状态存储在布尔数组中,然后您就不会遇到这个问题.....

Android复选框多选问题

于 2013-09-20T10:34:18.343 回答