【发布时间】:2015-01-04 20:28:55
【问题描述】:
我有一个显示医生列表视图供用户选择的活动。每个列表视图项都包含一个复选框和一个医生姓名。我的最终目标是当用户检查一个医生时,所有其他人都被删除,只剩下选定的医生。
在适配器类中,我有以下代码sn-p:
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked) {
swapCursor(cursor);
}
}
});
我有存储前一个光标的代码,因此如果未选中医生,则可以恢复它,但我已将其删除以简化此问题。目前,当我选中复选框时,没有任何反应。我尝试添加notifyDataSetChanged(),但适配器没有注册观察者,所以没有区别。如何让 Activity 知道某个项目已被选中?
从documentation 我知道我应该注册一个DataSetObserver 但我不知道应该注册哪个对象以及如何注册。
编辑
以下是我的 Adapter 类中的更多内容:
public MyAdapter(Context context, Cursor cursor, int flags){
super(context, cursor, flags);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
View view = LayoutInflater.from(context).inflate(R.layout.adapter_layout, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(view);
view.setTag(viewHolder);
return view;
}
@Override
public void bindView(View view, final Context context, final Cursor cursor) {
ViewHolder viewHolder = (ViewHolder) view.getTag();
String firstName = cursor.getString(cursor.getColumnIndex(DoctorEntry.COLUMN_FIRSTNAME));
String lastName = cursor.getString(cursor.getColumnIndex(DoctorEntry.COLUMN_LASTNAME));
String suffix = cursor.getString(cursor.getColumnIndex(DoctorEntry.COLUMN_SUFFIX));
viewHolder.nameView.setText(firstName + " " + lastName + ", " + suffix);
// Should I add something here?
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
}
});
}
public static class ViewHolder{
public final CheckBox checkBox;
public final TextView nameView;
public ViewHolder(View view){
checkBox = (CheckBox) view.findViewById(R.id.chooseDoctorCheckBox);
nameView = (TextView) view.findViewById(R.id.chooseDoctorLabel);
}
}
适配器用于实现 CursorLoader 以将数据加载到列表视图的活动中。在活动中,我可以拨打doctorAdapter.swapCursor(someCursorIWant);,但我无法引用所选医生。我尝试过的东西:
// Set currentDoctor (a property of the adapter class) if a new one is checked.
// Again, other checks removed for simplicity.
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
currentDoctor = cursor;
notifyDataSetChanged();
}
}
});
然后在活动中:
// Set observers
mDoctorAdapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
Cursor c = mDoctorAdapter.getCheckedDoctor();
if(c != null)
mDoctorAdapter.swapCursor(c);
}
});
但它并没有达到我想要的效果。
【问题讨论】:
-
你在使用 CursorLoader 吗?
-
是的,在活动中我有几行调用
doctorAdapter.swapCursor(someCursor),但如果我尝试在适配器类本身中调用它,它将不起作用。我无法将此代码移动到活动中,因为我不知道如何从活动中引用复选框侦听器。 -
将其注册到您的适配器。我从未使用过 android 适配器,但在 API 文档中我看到了
registerDataSetObserver(DataSetObserver)方法。你不能用那个吗?不确定我是否正确理解了这个问题 -
你在 CursorAdapter 构造函数中使用了哪些标志?
-
标志为 0,@VinceEmigh 我应该注册什么?我在活动中没有任何
DataSetObserver对象,也找不到任何可以转换为该类型的对象。
标签: java android listview android-sqlite android-cursoradapter