Android 单击复选框更新列表项内容

Android 单击复选框更新列表项内容,android,android-listview,Android,Android Listview,我有一个自定义列表视图,左侧有一个复选框和4个文本视图,与astrid task manager非常相似。 我打算做的是,单击复选框时,文本视图必须更新其值。起初,我的问题是,在选中位置1的复选框时,会在滚动时选中末尾或其他地方的复选框。在寻找解决方案的过程中,我了解了listview中视图的循环利用。我应用了像viewholder这样的概念,现在我能够保持复选框的状态。但是,在复选框单击时,我更改了文本视图,并且更改不会持续,这意味着任何随机电视也会显示相同的更改 我已在适配器中应用了一个复

我有一个自定义列表视图,左侧有一个复选框和4个文本视图,与astrid task manager非常相似。

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


我已在适配器中应用了一个复选框onclicklistener。有什么想法可以实现吗?

您希望将项目的状态保存在项目数据中,而不是保存在视图持有者中。视图持有者只是视图的一种便利,如果您循环使用视图,视图在不同的时间将显示许多不同的项目。在数据绑定期间,您需要绑定显示项目所需的所有状态,以避免随机数据出现在另一个列表项目的视图中

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

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