2016-05-30 115 views
1

在我的回收商項目佈局裏面我有一個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); 
    } 

} 

注:我已經覆蓋在父適配器類的OnCreateViewHolderOnBindViewViewHolder(ScrollBaseAdapter)叫 「我的」 版本這些方法在子類(VideoAdapter類)中被定義爲父類中的抽象類。但在父母OnCreateOnBind方法中沒有什麼特別的情況,他們最終甚至調用子女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)。出於某種原因,也許在回收商生命週期的某些事件中,此後它將不再受到檢查。我無法弄清楚。

回答

1

問題出在複選框的佈局屬性。我已將android:button設置爲nullandroid:drawableLeft到狀態列表,而不是將button屬性設置爲狀態列表。我這樣做是爲了解決一個android複選框的問題,其中當通過按鈕屬性設置drawable屬性時,將可繪製對象集中爲paddingLeftpaddingRight是不可能的。不幸的是,使用drawableLeft來設置複選框的drawable意味着在複選框上調用setChecked並不總是更新drawable的狀態。

+0

我不知道爲什麼,但今天也發生在我身上。過去它在很多場合都可以使用drawable。但今天突然它停止繪製工作,但正常工作的按鈕!那真是荒謬而不可預知的行爲 –