【发布时间】:2015-08-03 06:23:33
【问题描述】:
我正在实现CAB,我的 ListView 是从数据库中填充的。当我滚动 ListView 或旋转设备屏幕时,之前选择的项目的背景将恢复为默认背景。
我用来存储选择状态以在bindView中恢复它的持有人:
private static class ViewInfo {
boolean selected;
}
绑定视图:
@Override
public void bindView(View view, Context context, Cursor cursor) {
view.setOnLongClickListener(mOnLongClickListener);
Object tag = view.getTag();
if (tag != null) {
ViewInfo info = (ViewInfo) view.getTag();
view.setSelected(info.selected);
} else {
view.setTag(new ViewInfo());
}
// Load data from the database here
}
OnLongClickListener:
mOnLongClickListener = new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ViewInfo viewInfo = (ViewInfo) v.getTag();
v.setSelected(viewInfo.selected = !viewInfo.selected);
return true;
}
};
我的列表视图:
<ListView
android:id="@+id/filtering_list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:choiceMode="multipleChoiceModal"
android:drawSelectorOnTop="true" />
我的列表项背景filtering_list_item_bg:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/holo_blue_light" android:state_pressed="true"/>
<!-- pressed -->
<item android:drawable="@android:color/holo_blue_light" android:state_focused="true"/>
<!-- focused -->
<item android:drawable="@android:color/background_light" android:state_selected="true"/>
</selector>
我的列表项布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/filtering_list_item_bg"
android:paddingBottom="12dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:paddingTop="12dp" >
<!-- text views, image views, etc. -->
</RelativeLayout>
我在这里无法理解的是为什么setSelected 在bindView 中被调用但不改变背景。
【问题讨论】: