Android RecyclerView有5种不同的视图

时间:2018-02-19 13:34:27

标签: android android-recyclerview

我的搜索有一个recyclerview,我想将所有项目添加到它。我有 5个模型我写的数据。

此代码到目前为止,但它只显示前2项只有2请你能告诉我什么错了吗?

我的适用于recyclerView代码的适配器:

@Override
public int getItemViewType(int position) {
    if (models.getEvents().size() >= position && position >= 0){
        code = 0;
    }else if (position > models.getEvents().size() && position <= (models.getEvents().size()+models.getNews().size())){
        code = 1;
    }else if (position > (models.getNews().size()+models.getEvents().size()) && position <=
            (models.getEvents().size()+models.getNews().size()+models.getMemes().size())){
        code =2;
    }else if (position >(models.getEvents().size()+models.getNews().size()+models.getMemes().size())
    && position <= (models.getNews().size()+models.getEvents().size()+models.getMemes().size()+models.getExSites().size())){
        code = 3;
    }else if (position >(models.getNews().size()+models.getEvents().size()+models.getMemes().size()+models.getExSites().size()) &&position <=
            (models.getNews().size()+models.getEvents().size()+models.getMemes().size()+models.getExSites().size()+models.getTwitch().size())){
        code =4;
    }
    return code;
}
@Override
public SearchViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    switch (viewType){
        case 0:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.events_layout,parent,false);
            return new SearchViewHolder(view);
        case 1:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_layout,parent,false);
            return new SearchViewHolder(view);
        case 2:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.last_world_memes_list_item,parent,false);
            return new SearchViewHolder(view);
        case 3:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.last_url_view,parent,false);
            return new SearchViewHolder(view);
        case 5:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.twitch,parent,false);
            return new SearchViewHolder(view);
    }

    return new SearchViewHolder(view);
}

,此处我的绑定视图

@Override
public void onBindViewHolder(SearchViewHolder holder, final int position) {
    switch (holder.getItemViewType()){
        case 0:
            Events event = models.getEvents().get(position);
        do works
            return;
        case 1:
            final LastWorldMemes mNews = models.getNews().get(position-(models.getEvents().size()));

        do works
            return;
        case 2:
            LastWorldMemes memes = models.getMemes().get(position-(models.getEvents().size()+models.getNews().size()));

        do works
            return;
        case 3:
        do works
            return;
        case 4:

    }
}

问题是在recyclerview上获取itemCount这是我的代码,这是错误

int size =( models.getEvents().size()+models.getNews().size()+models.getTwitch().size()
        +models.getExSites().size()+models.getMemes().size());
  @Override
public int getItemCount() {
    return size;
}

这是错误

02-19 18:27:38.216 14902-14902/app.mma.introsliderproject E/UncaughtException: java.lang.IndexOutOfBoundsException: Index: 8, Size: 8
                                                                               at java.util.ArrayList.get(ArrayList.java:411)
                                                                               at app.mma.PokerInfo.search.SearchAdapter.onBindViewHolder(SearchAdapter.java:109)
                                                                               at app.mma.PokerInfo.search.SearchAdapter.onBindViewHolder(SearchAdapter.java:35)

2 个答案:

答案 0 :(得分:1)

问题在于:您没有数组作为数据,但在概念上是一个矩阵。那么会发生什么,总计数是所有阵列中所有子节点的总和。例如,你有3个事件和2个新闻,当适配器达到4个位置它告诉你在onBind位置3,所以你去新闻阵列里面有3个位置的新闻,但你只有2个新闻。

<强>解决方案

imho,你应该将所有项目(新闻,事件等)放在一个数组中(例如,如果数组是通用的ArrayList&lt; T&gt;),例如在适配器构造函数中,或者创建一个更新适配器的方法。

我希望如果没有发表评论就会很谨慎

修改

要了解您从数组中获得的项目类型,您可以使用

if(array.get(position) instanceof NewsItem{
   // here we have a news item
}

答案 1 :(得分:0)

我认为getItemViewType

中存在太多混淆

尝试简化:

final int eventsPositions = models.getEvents().size();
final int newsPositions = eventsPositions + models.getNews().size();
final int memesPositions = newsPositions + models.getMemes().size();
final int exSitesPositions = memesPositions + models.getExSites().size();

if (position < eventsSize) {
    code = 0;
} else if (position < newsPositions) {
   code = 1;
} else if (position < memesPositions) {
    code = 2;
} else if (position < exSitesPositions) {
    code = 3;
} else {
    code = 4;
}