我知道以前有人问过这个问题,但我对此有一些看法,但我似乎无法找到一个优雅的解决方案。
如何跟踪列表视图中选定的复选框,该列表视图使用自定义的可检查相对布局(具有复选框和其他文本视图),由自定义光标适配器支持,可以根据用户单击的内容更改大小(它过滤用户选择)。
我有我的 listview 活动,它使用自定义光标适配器(对 bindview 和 newview 函数进行适当的覆盖以及 viewHolder 类以利用视图回收)。
当用户单击行项目时,列表被过滤,并且负载管理器重新启动以显示新的过滤列表。这意味着我的列表视图大小在不断变化。此外,我尝试实现整个复选框 onclicklistener 覆盖以及设置和获取标签,但无论我在 bindview() 方法中做什么,复选框都不会被选中(这可能是因为它们在可检查的行中) . 此外,我对 getview 中的整个复选框 onclicklistener 覆盖(或我的情况下的 bindview 方法)感到非常困惑,而且我看到的许多解决方案都没有不断改变大小的列表视图。
任何帮助将不胜感激。
这是我的自定义光标适配器类。
public class TaskListViewAdapter extends CursorAdapter {
private LayoutInflater mLayoutInflater;
public TaskListViewAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder) view.getTag();
int nTaskStatus;
int nTaskType;
int nSuite;
String nTaskServiceTextColor;
String nTaskServiceBackgroundColor;
String nSuiteValue;
if (holder == null)
{
// Creates a ViewHolder and store references to the children views we want to bind data to.
holder = new ViewHolder();
holder.taskScreenCheckBox = (CheckBox) view.findViewById(R.id.taskScreenCheckBox);
holder.taskScreenRowText11 = (TextView) view.findViewById(R.id.taskScreenRowText11);
view.setTag(holder);
}
// Getting the data from the cursor and setting the row elements appropriately
if (cursor != null) {
holder.taskScreenRowText11.setText(cursor.getString(cursor.getColumnIndex(DatabaseAdapter.KEY_TASKS_NUMEROAPPEL)));
}
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
final View view = mLayoutInflater.inflate(R.layout.task_screen_row, parent, false);
return view;
}
/**
*
*
* A viewholder that stores each component of the task_screen_row view.
*
*/
static class ViewHolder {
CheckBox taskScreenCheckBox;
TextView taskScreenRowText11;
}
}
这是我的自定义 Checkable 行布局:
package com.courrierplus.mobi;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.CheckBox;
import android.widget.Checkable;
import android.widget.RelativeLayout;
public class CheckableRelativeLayout extends RelativeLayout implements Checkable {
private CheckBox mCheckbox;
public CheckableRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean isChecked() {
return mCheckbox.isChecked();
}
@Override
public void setChecked(boolean isChecked) {
mCheckbox.setChecked(isChecked);
}
@Override
public void toggle() {
mCheckbox.toggle();
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
final int childCount = this.getChildCount();
for (int i = 0; i < childCount; ++i) {
View v = getChildAt(i);
if (v instanceof CheckBox) {
mCheckbox = (CheckBox) v;
}
}
}
}
在我的 ListViewActivity 中,用户单击一行,调用 onListItemClick 函数,然后调用我的自定义适配器中的 newView 代码,该代码扩展我的自定义可检查行并检查其中的复选框。
我的问题是,当我获得复选框并手动尝试将其设置为选中时,在我的自定义适配器的 bindView 中它不起作用。另外,我不确定如何跟踪已检查的内容。