在我的回收商項目佈局裏面我有一個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。但今天突然它停止繪製工作,但正常工作的按鈕!那真是荒謬而不可預知的行爲 –