繁体   English   中英

带有 CheckBoxes 和点击监听器的 ListView

[英]ListView with CheckBoxes and a click listener

我想为使用自定义适配器的 ListView 的 CheckBoxes 实现单击侦听器。 像这样:

在此处输入图像描述

我知道choiceMode的存在,但我想自己实现。

我正在尝试应用良好的做法。 这是我的适配器的样子:

public class TaskListAdapter extends ArrayAdapter<ListTask> {
    private ArrayList<ListTask> mItems;
    private ArrayList<Boolean> mChecked;
    private LayoutInflater mInflater;

    public TaskListAdapter(Context context, int textViewResourceId, ArrayList<ListTask> items) {
        super(context, textViewResourceId, items);
        this.mItems = items;

        // Cache the LayoutInflate to avoid asking for a new one each time
        mInflater = LayoutInflater.from(context);

    // Initialize all checkboxes with false value
        mChecked = new ArrayList<Boolean>();
        for (int i = 0; i < this.getCount(); i++) {
        mChecked.add(i, false);
        }
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_row, null);

            holder = new ViewHolder();
            holder.checkbox = (CheckBox) convertView.findViewById(R.id.mycheckbox);
            holder.text = (TextView) convertView.findViewById(R.id.mytext);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        MyList mylist = mItems.get(position);

    holder.text.setText(mylist.getMyText());

        // Create a listener for the CheckBox
        holder.checkbox.setOnClickListener(new OnClickListener() {
    @Override
        public void onClick(View v) {
            if (holder.checkbox.isChecked()) {
            mChecked.set(position, true);
            } else {
            mChecked.set(position, false);
            }
        }

        });
        holder.checkbox.setChecked(mChecked.get(position));

        return convertView;
    }

    static class ViewHolder {
        CheckBox checkbox;
        TextView text;
    }
}

当我运行我的应用程序时,我收到此错误:

java.lang.IndexOutOfBoundsException:位置 0 无效,大小为 0

该错误是由该行引发的

holder.checkbox.setChecked(mChecked.get(position));

那是在 return 语句之前。

如果我评论它并重新运行应用程序,它会显示列表,但是当我点击一个复选框时,它也会为这一行抛出一个 IndexOutOfBoundsException:

mChecked.set(position, true);

那是在检查复选框是否被选中的“if”语句中。

我究竟做错了什么?

你检查position的值了吗? 您是否还确保定位正确的视图,甚至填充您的列表? 您可能没有填充您的 ListView。 据我所知,当涉及到 ListView 和 CheckBoxes 时,position 并不是我感兴趣的变量。

而不是像这样

for (int i = 0; i < this.getCount(); i++) { mChecked.add(i, false); }

试试看

for (int i = 0; i < mItems.size(); i++) { mChecked.add(i, false); }

我认为您提交给构造函数的ArrayList<ListTask>可能是 null,请检查一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM