2016-05-30 120 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。但今天突然它停止绘制工作,但正常工作的按钮!那真是荒谬而不可预知的行为 –