我有一个要在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;
}
答案 0 :(得分:0)
问题是要使用remove()
删除给定位置的项目,它期望参数的类型为int
。当前使用
taskList.remove(buttonView.getTag());
notifyDataSetChanged();
方法getTag()
返回Object
而不是int
,因此remove不会删除位置上的项目。您将需要将getTag()
返回的对象转换为int,因此它将删除给定位置的项目。