2016-05-30 15 views
1

私のリサイクラーアイテムのレイアウト内には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)OnCreateViewHolderOnBindViewViewHolderを上書きしましたサブクラス(VideoAdapterクラス)のこれらのメソッドのうち、親クラスでabstractとして定義されています。しかし、親のOnCreateOnBindの方法では何も起きていないので、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)が評価されています。なんらかの理由で、おそらくリサイクラーライフサイクルの中で、それはその後チェックされていません。私はそれを理解することはできません。

答えて

1

問題はチェックボックスのレイアウト属性にありました。 button属性を状態リストに設定するのではなく、android:buttonnullandroid:drawableLeftに設定しました。私は、drawable属性がbutton属性によって設定されている場合、ドロワーブルをpaddingLeftpaddingRightでセンタリングするとアンドロイドチェックボックスのバグを回避するためにこれを行いました。残念ながらdrawableLeftを使用してチェックボックスのドロアブルを設定すると、チェックボックスのsetCheckedを呼び出すと常にドロウアブルの状態が更新されるわけではありませんでした。

+0

私はなぜこれが私に起こったのか分かりません。そして過去には、多くの機会にdrawableで作業していました。しかし今日、突然、引出しのために働くのが止まったが、ボタンのためにはうまくいった!それは本当にばかげて予測できない動作です –

関連する問題