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

时间:2013-01-06 16:11:24

标签: android android-listview

我有一个自定义列表视图,项目布局左侧有一个复选框,4个文本视图很像astrid任务管理器。  enter image description here

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

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

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

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

Android checkbox multiselected issue