私のリサイクラーアイテムのレイアウト内にはCheckBox
があります。チェック状態はonBindView
です。最初の3つの項目にCheckBoxes
がチェックされているにもかかわらず、RecyclerView
が最初に表示されるときに問題が発生します。チェックされていないと表示されます。しかし、リストをスクロールしてスクロールした後、必要に応じてチェックされます。私はOnBindViewHolder
にブレークポイントを設定し、毎回チェック状態が正しく設定されています。しかし何らかの理由で初めてレンダリングされたときはチェックされません。CheckBoxでチェックイン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);
}
}
注:私は "私" のバージョンを呼び出すために親アダプタクラス(ScrollBaseAdapter)でOnCreateViewHolder
とOnBindViewViewHolder
を上書きしましたサブクラス(VideoAdapterクラス)のこれらのメソッドのうち、親クラスでabstractとして定義されています。しかし、親のOnCreate
とOnBind
の方法では何も起きていないので、CheckBox
が期待どおりに動作していない項目でも、子はmyMethods
と呼ばれてしまいます。チェックされた状態の問題が予測不可能に発生したより正確にレイアウト
<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で作業していました。しかし今日、突然、引出しのために働くのが止まったが、ボタンのためにはうまくいった!それは本当にばかげて予測できない動作です –