2016-03-01 96 views
2

我想在回收视图中显示不同的项目/布局。所以这是我如何定义这些项目:RecyclerView的onBindViewHolder中的ClassCastException

public class SearchItem { 

    public static final int TYPE_DEFAULT = 0; 
    public static final int TYPE_LOADING = 1; 

    public int type; 

    public SearchItem(int type) { 
     this.type = type; 
    } 

    public static class DefaultItem extends SearchItem { 

     public String title; 

     public DefaultItem(String title) { 
      super(TYPE_DEFAULT); 
      this.title = title; 
     } 
    } 

    public static class LoadingItem extends SearchItem { 

     public String icon, title; 

     public LoadingItem(String icon, String title) { 
      super(TYPE_LOADING); 
      this.icon = icon; 
      this.title = title; 
     } 
    } 
} 

所以基本上我有两种类型。在适配器的适当的布局将选择每个项目:

public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.BaseViewHolder>{ 

    public ArrayList<SearchItem> items = new ArrayList<>(); 

    @Override 
    public int getItemCount() { 
     return items.size(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return items.get(position).type; 
    } 


    @Override 
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     LayoutInflater mInflater = LayoutInflater.from(parent.getContext()); 

     switch (viewType) { 
      case SearchItem.TYPE_LOADING: 
       ViewGroup vLoading = (ViewGroup) mInflater.inflate(R.layout.search_item_loading, parent, false); 
       return new LoadingViewHolder(vLoading); 
      case SearchItem.TYPE_DEFAULT:default: 
       ViewGroup vDefault = (ViewGroup) mInflater.inflate(R.layout.search_item_default, parent, false); 
       return new DefaultViewHolder(vDefault); 
     } 
    } 

    @Override 
    public void onBindViewHolder(BaseViewHolder holder, int position) { 

     SearchItem item = items.get(position); 

     switch (holder.getItemViewType()) { 
      case SearchItem.TYPE_DEFAULT: 
       DefaultViewHolder defaultViewHolder = (DefaultViewHolder) holder; 
       defaultViewHolder.mTextViewTitle.setText(((SearchItem.DefaultItem)item).title); 
      case SearchItem.TYPE_LOADING: 
       LoadingViewHolder loadingViewHolder = (LoadingViewHolder) holder; 
       loadingViewHolder.mTextViewIcon.setText(((SearchItem.LoadingItem)item).icon); 
       loadingViewHolder.mTextViewTitle.setText(((SearchItem.LoadingItem)item).title); 
     } 
    } 

    /** 
    * Base view holder. 
    */ 
    public static class BaseViewHolder extends RecyclerView.ViewHolder { 
     public BaseViewHolder(View view) { 
      super(view); 
     } 
    } 

    public static class DefaultViewHolder extends BaseViewHolder { 

     @Bind(R.id.mTextViewTitle) 
     TextView mTextViewTitle; 

     public DefaultViewHolder(View mView) { 
      super(mView); 
      ButterKnife.bind(this, mView); 
     } 
    } 

    public static class LoadingViewHolder extends BaseViewHolder { 

     @Bind(R.id.mTextViewIcon) 
     TextView mTextViewIcon; 

     @Bind(R.id.mTextViewTitle) 
     TextView mTextViewTitle; 

     public LoadingViewHolder(View mView) { 
      super(mView); 
      ButterKnife.bind(this, mView); 
     } 
    } 
} 

onBindViewHolder

LoadingViewHolder loadingViewHolder = (LoadingViewHolder) holder; 

机器人工作室已经给了我铸造holderLoadingViewHolder的时候,我可能会得到一个异常的警告。运行项目时,我得到:

SearchAdapter$DefaultViewHolder cannot be cast to SearchAdapter$LoadingViewHolder 

因此不知何故DefaultViewHolder被转移到LoadingViewHolder,但它不应该。相反,BaseViewHolder应该被铸造。你看到最新的错误?

+0

'holder.getItemViewType()'似乎不存在。 – CommonsWare

回答

1

你写的代码是错误的,因为你的要求和你想要实现的。我所看到的实施要扩展不通用RecyclerView持有人,即这将需要在基础视图架为单座

extends RecyclerView.Adapter<RecyclerView.ViewHolder> 

而不是

extends RecyclerView.Adapter<SearchAdapter.BaseViewHolder> 

在这里,整个代码是如何做到这一点


https://gist.github.com/umesh0492/e65d5195d8962b1a3049

+0

SearchAdapter.BaseViewHolder是RecyclerView.ViewHolder的子类,所以这不应该是问题。 –

+0

@artworkadシ这就是我所说的,如果你只扩展BaseViewHolder,那么你只能访问该视图/持有者类型。您不能使用其他持有人类型的视图进行游戏。你必须扩展我上面提到的内容,在那里我可以看一下如何做到这一点。 – UMESH0492

+0

我试过了你的建议,但是我得到了同样的错误... –

0

这可能是LAT e但是对于得到相同错误的人。 在每种情况下都使用“break”,并且不会出现任何错误。

+0

像是换行符还是代码执行中断? – NickSentowski

相关问题