0

I have a recyclerview for my search and I want to add all of my items to it.I have 5 models of data I write.

This code so far but its only show first 2 items only 2 please can you tell me what's wrong?

my Adapter for recyclerView code:

@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);
}

and here my bind 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:

    }
}

the problem is get itemCount on recyclerview this is my code and here is the error

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

and this is the error

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)
Sadegh
  • 55
  • 7

2 Answers2

1

The problem is that: you don't have an array as data, but conceptually an matrix. So what happen, total count is the sum of all childs of all your arrays. For example, you have 3 events and 2 news, when adapter reach 4 position it tell you inside onBind position 3, so you go to get inside news array the news with position 3, but you have only 2 news.

Solution

imho, you should put all items (news , events, etc) inside one array (maybe if array is generic ArrayList< T >) for example inside adapter constructor or create a method that update your adapter.

i hope to was cleary if it's not post a comment

Edit

For understand what type of item are you get from array you can use

if(array.get(position) instanceof NewsItem{
   // here we have a news item
}
an_droid_dev
  • 1,136
  • 14
  • 18
  • what a great Solution but i want to know you say me put all off my items in one array with tags and in getViewtype() i should write if tag.equals("event"){viewtype =0 }??? – Sadegh Feb 19 '18 at 15:28
  • @Sadegh you can use instanceof to check type of item. I edit my answer – an_droid_dev Feb 19 '18 at 15:40
  • i know what you say but i dont know how get instance i will search thanks a lot and if you can tell me that be wonderful – Sadegh Feb 19 '18 at 15:55
  • i really confused how can put all of my items in one array?i should create a model for my all items? – Sadegh Feb 19 '18 at 15:57
  • You should create inside your adapter an array generic (i don't now if you know Generics in Java, if not use Object) like this ArrayList allItems = new ArrayList()<> and iterate all of your models and put its inside array – an_droid_dev Feb 19 '18 at 16:10
  • this is an example of Adapter with generics https://stackoverflow.com/questions/24994661/custom-android-adapter-with-generic-class – an_droid_dev Feb 19 '18 at 16:14
  • i get it thanks a lot for your time i wish i could do something for you <3 – Sadegh Feb 19 '18 at 16:19
0

I think there is too much confusion in getItemViewType

try simplify:

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;
}
Pnemonic
  • 1,685
  • 17
  • 17
  • thanks a lot for answer but with this method its too hard to get the size and adapter to get models is harder too but with acepted answer method you can just do Events event = models.get(postion); its so simple but on your way you should do Events event = models.get(postion+news.size); – Sadegh Feb 20 '18 at 17:33