在我的回收商项目布局里面我有一个CheckBox
,我在onBindView
中设置了检查状态。问题是什么时候RecyclerView
第一次显示,即使前三项应该有他们的CheckBoxes
检查,他们出现未选中。但是在向下滚动列表并滚动回来之后,它们会根据需要进行检查。我在OnBindViewHolder
中设置了一个断点,并且每次都正确设置了检查状态。但由于某种原因,第一次渲染时不会被检查。复选框OnBindViewHolder检查显示时没有选中
我RecyclerView适配器:
public class VideoAdapter extends ScrollBaseAdapter<VideoAdapter.VideoViewHolder>
public class VideoViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
CheckBox mBookmarkChkBox;
public VideoViewHolder(View view) {
mBookmarkChkBox = (CheckBox) view.findViewById(R.id.checkbox_bookmark_video);
mBookmarkChkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bookmark(getAdapterPosition(), ((CheckBox)v).isChecked());
}
});
}
@Override
public VideoViewHolder myCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item_video, parent, false);
return new VideoViewHolder(view);
}
@Override
public void myBindViewHolder(final VideoViewHolder holder, final int position) {
mCursor.moveToPosition(position);
holder.mBookmarkChkBox.setChecked(mCursor.getString(VideoListFragment.COL_BOOKMARK_ID) != null);
}
}
我打电话notifyDataSetChanged
我每次更新适配器的光标时间。
ScrollBaseAdapter(父类):
public abstract class ScrollBaseAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
protected Cursor mCursor;
public void swapCursor(Cursor cursor){
mCursor = cursor;
notifyDataSetChanged();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder holder;
View view;
if(checkViewTypeFlag(viewType, VIEW_TYPE_LOADING)){
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.progressbar_loading, parent, false);
holder = new ProgressViewHolder(view);
}
else{
holder = myCreateViewHolder(parent, viewType);
}
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if(checkViewTypeFlag(getItemViewType(position), VIEW_TYPE_LOADING)){
return;
}
myBindViewHolder((VH) holder, position);
}
}
注:我已经覆盖在父适配器类的OnCreateViewHolder
和OnBindViewViewHolder
(ScrollBaseAdapter)叫 “我的” 版本这些方法在子类(VideoAdapter类)中被定义为父类中的抽象类。但在父母OnCreate
和OnBind
方法中没有什么特别的情况,他们最终甚至调用子女myMethods
,即使那些CheckBox
表现不如预期的项目。
在布局复选框
<CheckBox
android:id="@+id/checkbox_bookmark_video"
android:button="@null"
android:drawableLeft="@drawable/selector_favorite"
android:drawableStart="@drawable/selector_favorite"
android:gravity="center"
android:padding="@dimen/small_button_drawable_padding"
android:layout_width="@dimen/small_button_size"
android:layout_height="@dimen/small_button_size"
/>
selector_favorite
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/ic_favorite_on" />
<item android:drawable="@drawable/ic_favorite_off" />
</selector>
UPDATE 更精确地发生不可预测的选中状态的问题。在某些场合启动活动后,复选框会显示为选中状态,但其他时候它们会显示为未选中状态,我必须向下滚动并显示已选状态。即使在未勾选复选框的时候,复选框上正在评估setChecked(true)
。出于某种原因,也许在回收商生命周期的某些事件中,此后它将不再受到检查。我无法弄清楚。
我不知道为什么,但今天也发生在我身上。过去它在很多场合都可以使用drawable。但今天突然它停止绘制工作,但正常工作的按钮!那真是荒谬而不可预知的行为 –