代码之家  ›  专栏  ›  技术社区  ›  Sadegh

具有5种不同视图的Android RecyclerView

  •  0
  • Sadegh  · 技术社区  · 7 年前

    我有一个用于搜索的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 回复  |  直到 7 年前
        1
  •  1
  •   an_droid_dev    7 年前

    问题是:你没有一个数组作为数据,但概念上是一个矩阵。所以,total count是所有数组中所有子级的总和。例如,您有3个事件和2条新闻,当适配器到达4个位置时,它会告诉您内部onBind位置3,因此您可以使用位置3获取内部新闻数组中的新闻,但您只有2条新闻。

    解决方案

    我想,您应该将所有项目(新闻、事件等)放在一个数组中(如果数组是通用的ArrayList,则可能是lt;T>)例如,在适配器构造函数内部或创建更新适配器的方法。

    如果不是发表评论的话,我希望是清楚的

    编辑

    为了了解您可以从数组中获得什么类型的项

    if(array.get(position) instanceof NewsItem{
       // here we have a news item
    }
    
        2
  •  0
  •   Pnemonic    7 年前

    我认为这里面有太多的混乱 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;
    }