需要帮助使用CheckBoxes删除Android ListView项目

时间:2019-05-06 06:11:07

标签: android listview checkbox

我有一个要在ListView中显示的任务列表。每个ListView项的内部都有一个带有任务标题的CheckBox和一个显示到期日期的TextView。我正在尝试解决的问题是在选中ListView项内的Checkbox时从列表中删除该项。

我现在所拥有的是为CheckBox设置的OnCheckChangedListener,位于列表视图的适配器内部。这是在getView()方法中设置的。单击复选框后,将从ArrayList中删除任务,并使用新的taskList制作一个新的CustomAdapter并将其应用于列表视图。这没有用,所以我添加了一个处理程序以在UI线程上进行这些更改。仍然不起作用。从日志中,我可以知道正在调用侦听器,但没有删除这些项目。

ArrayList<Task> taskList;
Context mContext;
ListView listView;
Handler handler;

public CustomAdapter(Context mContext, ArrayList<Task> taskList){
    this.mContext = mContext;
    this.taskList = taskList;
    this.handler = new Handler(mContext.getMainLooper());
}

@Override
public int getCount() {
    return taskList.size();
}

@Override
public Object getItem(int position) {
    return taskList.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null){
        convertView = LayoutInflater.from(mContext).inflate(R.layout.listview_item,parent,false);
    }

    final View row = convertView;

    CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.checkBoxTask);
    TextView textTaskDueDate = (TextView)convertView.findViewById(R.id.textTaskDueDate);

    checkBox.setText(taskList.get(position).getTask());
    textTaskDueDate.setText("Due Date: " + taskList.get(position).getDueDate());

    checkBox.setTag(position);

    listView = parent.findViewById(R.id.listViewTasks);

    checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(isChecked){
                Log.i("CheckBox Listener", "Check heard");
                Log.i("Button Tag", String.valueOf(buttonView.getTag()));
                Log.i("taskList length before", String.valueOf(taskList.size()));
                taskList.remove(buttonView.getTag());
                Log.i("taskList length after", String.valueOf(taskList.size()));
                notifyDataSetChanged();
            }
        }
    });

    return convertView;
}

1 个答案:

答案 0 :(得分:0)

问题是要使用remove()删除给定位置的项目,它期望参数的类型为int。当前使用

taskList.remove(buttonView.getTag()); 
notifyDataSetChanged();

方法getTag()返回Object而不是int,因此remove不会删除位置上的项目。您将需要将getTag()返回的对象转换为int,因此它将删除给定位置的项目。