Taki
Taki

Reputation: 3730

Recylerview with multiple view types

i'm trying to make recyclerview with four viewtypes , each viewtype will represent certain data , my app is for premier league ( football ) , so i have viewtype for goals , yellow card,and red card , each string comes with the time of scoring the goal , or getting the yellow card and red card , i'm trying to apply some logic but it is not working for me

       //Splitting Strings
       String[] homeg = hometiming.split(";");
       String[] homeyello = homeyellow.split(";");
       String[] homere = homered.split(";");

       for (String h : homeg) {
           if (!h.equals("")) {

               int subgoals = Integer.parseInt(h.substring(0, 1));

               for (String y : homeyello) {
                   if (!y.equals("")) {

                       int subYellow = Integer.parseInt(y.substring(0, 1));

                       for (String n : homere) {
                           if (!n.equals("")) {
                               int subRed = Integer.parseInt(n.substring(0, 1));

                               /// if goals time is smaller than time of yellow and rec card , show 
                               /// goals
                               if (subgoals < subYellow && subgoals < subRed) {

                                   GoalsItem goalsItem = new GoalsItem();
                                   goalsItem.setHomegoals("goals :" + h + "\n");
                                   consolidatedlist.add(goalsItem);
                               }
                               /// if yellow cards time is smaller than time of goals and red cards , 
                               /// show yellow cards
                               else if (subYellow < subgoals && subYellow < subRed) {

                                   YellowItems yellowItems = new YellowItems();
                                   yellowItems.setHomeyellow("yellow :" + y + "\n");
                                   consolidatedlist.add(yellowItems);
                                }
                               /// if red card time is smaller than time of goals and yellow cards , 
                               /// show red cards
                               else if (subRed < subgoals && subRed < subYellow) {
                                   RedItems redItems = new RedItems();
                                   redItems.setHomered("red : " + n + "\n");
                                   consolidatedlist.add(redItems);

                           } } } } } } }
 @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        switch (holder.getItemViewType()) {

            case TypeItem.TYPE_PHOTO:
                PhotoItem photoItem = (PhotoItem) list.get(position);
                ViewPhoto viewphoto = (ViewPhoto) holder;
                viewphoto.date.setText("" + photoItem.getDate());
                Picasso.with(context).load(photoItem.getPhoto()).fit().into(((ViewPhoto) holder).photo);
                break;

            case TypeItem.TYPE_Goals:
                GoalsItem goalsItem = (GoalsItem) list.get(position);
                ViewGoals viewgoals = (ViewGoals) holder;
                viewgoals.homegoals.setText("" + goalsItem.getHomegoals());
                viewgoals.awaygoals.setText("" + goalsItem.getAwaygoals());

                break;

            case TypeItem.TYPE_Yellow:
                YellowItems yellowItems = (YellowItems) list.get(position);
                ViewYellow viewyellow = (ViewYellow) holder;
                viewyellow.homeyellow.setText("" + yellowItems.getHomeyellow());
                viewyellow.awayyellow.setText("" + yellowItems.getAwayyellow());

                break;
            case TypeItem.TYPE_RED:
                RedItems redItems = (RedItems) list.get(position);
                ViewRed viewred = (ViewRed) holder;
                viewred.homered.setText("" + redItems.getHomered());
                viewred.awayred.setText("" +redItems.getAwayred());
                break;

        }
    }
         "strHomeGoalDetails":"",
         "strHomeRedCards":"",
         "strHomeYellowCards":"13':Luka Milivojevic;",
         "strAwayRedCards":"",
         "strAwayYellowCards":"47':Raheem Sterling;",
         "strAwayGoalDetails":"39':Gabriel Jesus;41':David Silva;",

Upvotes: 0

Views: 103

Answers (1)

Mindgamer
Mindgamer

Reputation: 239

You have to override getItemViewType(position: Int) , than by viewType in onCreatecreate return different ViewHolders (if you need), and than in onBindViewHolder do you bindings by your types

For example in your adapter class create map with typeField: String, and key: Int

private val keyMap = HashMap<String, Int>().apply {
    put("FIRST_TYPE", 1)
    put("SECOND_TYPE", 2)
    put("THIRD_TYPE", 3)
}

the second step is to override getItemViewType(position: Int)

override fun getItemViewType(position: Int): Int {
return keyMap.get(yourItemList(position).getType())

Third step - override onCreateViewHolder

 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ResourceViewHolder {
        return when (viewType) {
           keyMap.get("FIRST_TYPE") -> //create specific ViewHolder
           keyMap.get("SECOND_TYPE") -> //create specific ViewHolder
           //etc
}

The last part is to bind onBindViewHolder

You can do this the same way as onCreateViewHolder

Upvotes: 1

Related Questions