java.lang.IndexOutOfBoundsException When Displaying Multiple Data in RecyclerView

Sead Lab :

I have 3 parts of data displayed in one RecyclerView:

  1. storyList
  2. yukulList
  3. homeList

When I've tried to display only storyList or yukulList or homeList data in RecyclerView, it works. But when I've tried to display more than one data, for example: storyList && yukulList or storyList && yukulList && homeList, it will show

java.lang.IndexOutOfBoundsException.

I've tried to add notifyDataSetChanged() but it can't works.

ShowFavouriteList.java

public class ShowFavouriteList extends AppCompatActivity implements AdapterFavList.FavListener {

    private RecyclerView recyclerView;
    private TextView noFavtsTV;
    AppPreferences appPreferences;
    private SearchView searchView;
    private AdapterFavList yAdapterFavlist;
    private AdapterFavList mAdapterFavlist;
    private AdapterFavList tAdapterFavlist;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_favourite_list);

        SwipeRefreshLayout pullToRefresh = findViewById(R.id.pullToRefresh);
        pullToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                finish();
                startActivity(getIntent());
            }
        });

        //toolbar logo and desc
        Toolbar topToolBar = (Toolbar) findViewById(R.id.toolbarTidur);
        setSupportActionBar(topToolBar); //munculkan menu ke toolbar
        getSupportActionBar().setDisplayHomeAsUpEnabled(true); //this line shows back button

        recyclerView = findViewById(R.id.recycler_view);
        noFavtsTV = findViewById(R.id.no_favt_text);

        SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("MyPref", 0);
        SharedPreferences sPTuru = getApplicationContext().getSharedPreferences("MyTuru", 0);
        SharedPreferences sPHome = getApplicationContext().getSharedPreferences("MyHome", 0);
        PreferenceMenejer preferenceMenejer = new PreferenceMenejer(sharedPreferences, sPTuru, sPHome);
        appPreferences = new AppPreferences(preferenceMenejer);

        fetchData();

    } // Oncreate

    private void fetchData() {
        List<Story> storyList = appPreferences.getFavouriteCardList();
        List<YukulModel> yukulList = appPreferences.getFavouriteYukul();
        List<HomeModel> homeList = appPreferences.getFavouriteHome();

        if(storyList != null && storyList.size() > 0) {
            showNoFavtText(false);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
            tAdapterFavlist = new AdapterFavList(this, storyList, yukulList, homeList, this, appPreferences);
            recyclerView.setAdapter(tAdapterFavlist);
            tAdapterFavlist.notifyDataSetChanged();
        }

        if(yukulList != null && yukulList.size() > 0) {
            showNoFavtText(false);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
            yAdapterFavlist = new AdapterFavList(this, storyList, yukulList, homeList, this, appPreferences);
            recyclerView.setAdapter(yAdapterFavlist);
            yAdapterFavlist.notifyDataSetChanged();
        }

        if(homeList != null && homeList.size() > 0) {
            showNoFavtText(false);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
            mAdapterFavlist = new AdapterFavList(this, storyList, yukulList, homeList, this, appPreferences);
            recyclerView.setAdapter(mAdapterFavlist);
            mAdapterFavlist.notifyDataSetChanged();
        }
    }

    @Override
    public void onItemKlik(RecyclerView.ViewHolder viewHolder, HomeModel modelField, int position) {
        // Tidur List
        List<HomeModel> modelList = appPreferences.getFavouriteHome();

            HomeModel click = modelList.get(position);
            Toast.makeText(getApplicationContext(), "Selected: " + click.getName(), Toast.LENGTH_LONG).show();
            int id = Integer.parseInt(click.getIdStory());

            if (id == 0) {
                startActivity(new Intent(this, DoaPagi.class));
            } else if (id == 1) {
                startActivity(new Intent(this, DoaSore.class));
            } else if (id == 2) {
                startActivity(new Intent(this, DoaWc.class));
            } else if (id == 3) {
                startActivity(new Intent(this, DoaMasjid.class));
            } else if (id == 4) {
                startActivity(new Intent(this, DzikirShalat.class));
            } else if (id == 5) {
                startActivity(new Intent(this, ChildYukul.class));
            } else if (id == 6) {
                startActivity(new Intent(this, DoaPakaian.class));
            } else if (id == 7) {
                startActivity(new Intent(this, ChildTidur.class));
            }
    }

    @Override
    public void onItemTuru(RecyclerView.ViewHolder viewHolder, Story tField, int position) {
        // Tidur List
        List<Story> storyList = appPreferences.getFavouriteCardList();

            Story clic = storyList.get(position);
            int idTuru = Integer.parseInt(clic.getIdStory());

            if (idTuru == 0) {
                startActivity(new Intent(this, DoaMauTidur.class));
            } else if (idTuru == 1) {
                startActivity(new Intent(this, DoaBangunt.class));
            } else if (idTuru == 2) {
                startActivity(new Intent(this, DoaJimak.class));
            }
    }

    @Override
    public void onItemYukul(RecyclerView.ViewHolder viewHolder, YukulModel yField, int position) {
        // Tidur List
    }

    private void showNoFavtText(boolean show) {
        noFavtsTV.setVisibility(show ? View.VISIBLE : View.GONE); //jika data yang ditampilkan tidak ada, maka show noFavsTv
        recyclerView.setVisibility(show ? View.GONE : View.VISIBLE); //jika data yang ditampilkan tidak ada, maka don't show rV
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.search_fav, menu);
        getMenuInflater().inflate(R.menu.menu_main, menu);

        // Associate searchable_tidur configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        searchView = (SearchView) menu.findItem(R.id.action_search_fav).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setMaxWidth(Integer.MAX_VALUE);

        // listening to search query text change
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                // filter recycler view when query submitted
                mAdapterFavlist.getFilter().filter(query);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String query) {
                // filter recycler view when text is changed
                mAdapterFavlist.getFilter().filter(query);
                return false;
            }
        });
        return true;
    }

    // Agar back button pada halaman induk settings berfungsi
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.search_fav) {
            return true;
        }

        switch (item.getItemId()) {
            case android.R.id.home:
                this.finish();
                return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

AdapterFavList.java

public class AdapterFavList extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable {

    public static final String ACTION_LIKE_IMAGE_CLICKED = "action_like_image_button";

    final int VIEW_TYPE_TIDUR = 0;
    final int VIEW_TYPE_YUKUL = 1;
    final int VIEW_TYPE_HOME = 2;

    private Context context;
    private AppPreferences appPreferences;
    private List<Story> storyList;
    private List<YukulModel> yukulList;
    private List<HomeModel> homeList;
    private List<HomeModel> homeListFiltered;
    private List<Object> collection = new ArrayList<Object>();
    private FavListener listener;

    private int changedItemPosition;
    private boolean isLiked;

    public AdapterFavList(Context context, List<Story> storyList, List<YukulModel> yukulList, List<HomeModel> homeList, FavListener listener, AppPreferences appPreferences) {

        this.context = context;
        this.storyList = storyList;
        this.yukulList = yukulList;
        this.homeListFiltered = homeList;
        this.listener = listener;
        this.appPreferences = appPreferences;

        addData();
    }

    public void addData() {
        storyList = appPreferences.getFavouriteCardList();
        yukulList = appPreferences.getFavouriteYukul();
        homeList = appPreferences.getFavouriteHome();

        if(storyList != null && storyList.size() > 0) {
            collection.addAll(storyList);
        }

        if(yukulList != null && yukulList.size() > 0) {
            collection.addAll(yukulList);
        }

        if(homeList != null && homeList.size() > 0) {
            collection.addAll(homeListFiltered);
        }
    }

    public interface FavListener {
        void onItemKlik(RecyclerView.ViewHolder viewHolder, HomeModel modelField, int position);
        void onItemTuru(RecyclerView.ViewHolder viewHolder, Story tField, int position);
        void onItemYukul(RecyclerView.ViewHolder viewHolder, YukulModel yField, int position);
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if(viewType == VIEW_TYPE_TIDUR) {
            return new tidurViewHolder(LayoutInflater.from(context).inflate(R.layout.item_story_favourite_list, parent, false));
        }

        if(viewType == VIEW_TYPE_YUKUL) {
            return new yukulViewHolder(LayoutInflater.from(context).inflate(R.layout.item_favourite_yukul, parent, false));
        }

        if(viewType == VIEW_TYPE_HOME) {
            return new homeViewHolder(LayoutInflater.from(context).inflate(R.layout.item_fav_home, parent, false));
        }

        return null;
    }

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

        Object item = collection.get(position);

        if(holder instanceof tidurViewHolder){
            ((tidurViewHolder) holder).bind(storyList.get(position));
            ((tidurViewHolder) holder).setViewData((Story) item, holder.getAdapterPosition());
        }

        if(holder instanceof yukulViewHolder){
            ((yukulViewHolder) holder).bind(yukulList.get(position));
            ((yukulViewHolder) holder).viewDataYukul((YukulModel) item, holder.getAdapterPosition());
        }

        if(holder instanceof homeViewHolder){
            ((homeViewHolder) holder).bind(homeList.get(position));
            ((homeViewHolder) holder).viewDataHome((HomeModel) item, holder.getAdapterPosition());
        }
    }

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

    @Override
    public int getItemViewType(int position){

        Object item = collection.get(position);

        if(item instanceof Story) {
            return VIEW_TYPE_TIDUR;
        }

        if(item instanceof YukulModel){
            return VIEW_TYPE_YUKUL;
        }

        if(item instanceof HomeModel){
            return VIEW_TYPE_HOME;
        }

        return -1;
    }

    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                String charString = charSequence.toString();
                List<HomeModel> homeList = appPreferences.getFavouriteHome();
                if (charString.isEmpty()) {
                    homeListFiltered = homeList;
                }
                else {
                    List<HomeModel> filteredList = new ArrayList<>();
                    for (HomeModel row : homeList) {

                        if ( row.getName().toLowerCase().contains(charString.toLowerCase()) ) {
                            filteredList.add(row);
                        }
                    }

                    homeListFiltered = filteredList;
                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = homeListFiltered;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                homeListFiltered = (ArrayList<HomeModel>) filterResults.values;
                notifyDataSetChanged();
            }
        };
    } //Filter

    public void tidurPutHeart(boolean isChecked, Story tidurstory) {
        SharedPreferences tidursharedPreferences = context.getSharedPreferences("Turu", Activity.MODE_PRIVATE);
        SharedPreferences.Editor tidureditor = tidursharedPreferences.edit();
        tidureditor.putBoolean(tidurstory.getIdStory(), isChecked);
        tidureditor.commit();
    }

    public void yukulPutHeart(boolean isChecked, YukulModel yukulstory) {
        SharedPreferences yukulsharedPreferences = context.getSharedPreferences("Yukul", Activity.MODE_PRIVATE);
        SharedPreferences.Editor yukuleditor = yukulsharedPreferences.edit();
        yukuleditor.putBoolean(yukulstory.getIdStory(), isChecked);
        yukuleditor.commit();
    }

    public void homePutHeart(boolean isChecked, HomeModel homestory) {
        SharedPreferences homesharedPreferences = context.getSharedPreferences("Home", Activity.MODE_PRIVATE);
        SharedPreferences.Editor homeeditor = homesharedPreferences.edit();
        homeeditor.putBoolean(homestory.getIdStory(), isChecked);
        homeeditor.commit();
    }

    //ViewHolder
    public class tidurViewHolder extends RecyclerView.ViewHolder {
        private TextView textView;
        private CheckBox likeCheckBox;

        public tidurViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.text_view);
            likeCheckBox = itemView.findViewById(R.id.like_button_cb);
        } // itemView

        public void bind(final Story item) {
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null){
                        int position = getAdapterPosition();

                        if (position != RecyclerView.NO_POSITION) {
                            listener.onItemTuru(tidurViewHolder.this, item, position);
                        }
                    }
                }
            });
        }

        public void setViewData(final Story story, final int adapterPosition) {

            textView.setText(story.getName());

            if (story.getIsLiked() == 1) {
                likeCheckBox.setChecked(false);
            }
            else {
                likeCheckBox.setChecked(true);
            }

            likeCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    changedItemPosition = adapterPosition;

                    if (buttonView.isPressed()) {
                        if (isChecked) {
                            tidurPutHeart(isChecked, story);
                            appPreferences.saveFavouriteCard(story);
                        }
                        else {
                            isLiked = false;
                            tidurPutHeart(isChecked, story);
                            appPreferences.deleteCard(story.getIdStory());
                            // updateLikes();
                            Toast.makeText(context, "Removed", Toast.LENGTH_SHORT).show();

                            if(collection.size() == 0) {
                                ((Activity)context).finish();
                                context.startActivity(((Activity) context).getIntent());
                            }
                        }
                    }
                }
            });

        } //setviewdata

        public void updateLikes() {
            if (!isLiked && storyList.get(changedItemPosition).getIsLiked() == 0) { //jika like dicabut (pada posisi hati yang sedang merah) di halaman favourite list
                storyList.get(changedItemPosition).setIsLiked(0); //maka cabut juga warna merah di halaman favourite list
                notifyItemRangeChanged(getAdapterPosition(), collection.size());
                collection.remove(getAdapterPosition());
                notifyItemRemoved(getAdapterPosition());
            }

        } //updateLikes

    } //tidurViewholder


    //homeViewHolder
    public class homeViewHolder extends RecyclerView.ViewHolder {
        private TextView textView;
        private CheckBox likeCheckBox;

        public homeViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.text_view);
            likeCheckBox = itemView.findViewById(R.id.like_button_cb);
        } // itemView

        public void bind(final HomeModel item) {
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null){
                        int position = getAdapterPosition();

                        if (position != RecyclerView.NO_POSITION) {
                            listener.onItemKlik(homeViewHolder.this, item, position);
                        }
                    }
                }
            });
        }

        public void viewDataHome(final HomeModel story, final int adapterPosition) {

            textView.setText(story.getName());

            if (story.getIsLiked() == 1) {
                likeCheckBox.setChecked(false);
            }
            else {
                likeCheckBox.setChecked(true);
            }

            likeCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    changedItemPosition = adapterPosition;

                    if (buttonView.isPressed()) {
                        if (isChecked) {
                            homePutHeart(isChecked, story);
                            appPreferences.saveFavouriteHome(story);
                        }
                        else {
                            isLiked = false;
                            homePutHeart(isChecked, story);
                            appPreferences.deleteCardHome(story.getIdStory());
                            // updateLikesHome();
                            Toast.makeText(context, "Removed", Toast.LENGTH_SHORT).show();

                            if(collection.size() == 0) {
                                ((Activity)context).finish();
                                context.startActivity(((Activity) context).getIntent());
                            }
                        }
                    }
                }
            });

        } //setviewdata

        public void updateLikesHome() {
            if (!isLiked && homeList.get(changedItemPosition).getIsLiked() == 0) { //jika like dicabut (pada posisi hati yang sedang merah) di halaman favourite list
                homeList.get(changedItemPosition).setIsLiked(0); //maka cabut juga warna merah di halaman favourite list
                notifyItemRangeChanged(getAdapterPosition(), collection.size());
                collection.remove(getAdapterPosition());
                notifyItemRemoved(getAdapterPosition());
            }

        } //updateLikes

    } //homeviewholder


    public class yukulViewHolder extends RecyclerView.ViewHolder {
        private TextView textView;
        private CheckBox likeCheckBox;

        public yukulViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.text_view);
            likeCheckBox = itemView.findViewById(R.id.like_button_cb);
        } //itemview

        public void bind(final YukulModel item) {
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null){
                        int position = getAdapterPosition();

                        if (position != RecyclerView.NO_POSITION) {
                            listener.onItemYukul(yukulViewHolder.this, item, position);
                        }
                    }
                }
            });
        }

        public void viewDataYukul(final YukulModel yukulId, final int adapterPosition) {

            textView.setText(yukulId.getName());

            if (yukulId.getIsLiked() == 1) {
                likeCheckBox.setChecked(false);
            }
            else {
                likeCheckBox.setChecked(true);
            }

            likeCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    changedItemPosition = adapterPosition;

                    if (buttonView.isPressed()) {
                        if (isChecked) {
                            yukulPutHeart(isChecked, yukulId);
                            appPreferences.saveFavouriteYukul(yukulId);
                        }
                        else {
                            isLiked = false;
                            yukulPutHeart(isChecked, yukulId);
                            appPreferences.deleteCardYukul(yukulId.getIdStory());
                            // updateLikeYukul();
                            Toast.makeText(context, "Removed", Toast.LENGTH_SHORT).show();

                            if(collection.size() == 0) {
                                ((Activity)context).finish();
                                context.startActivity(((Activity) context).getIntent());
                            }
                        }
                    }
                }
            });

        } //viewdatayukul

        public void updateLikeYukul() {
            if (!isLiked && yukulList.get(changedItemPosition).getIsLiked() == 0) { //jika like dicabut (pada posisi hati yang sedang merah) di halaman favourite list
                yukulList.get(changedItemPosition).setIsLiked(0); //maka cabut juga warna merah di halaman favourite list
                notifyItemRangeChanged(getAdapterPosition(), collection.size());
                collection.remove(getAdapterPosition());
                notifyItemRemoved(getAdapterPosition());
            }
        } //updateLikes

    } //yukulviewholder


} //HomeAdapter

Logcat

2019-07-20 09:54:52.822 6902-6902/com.seadlab.doadandzikir E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.seadlab.doadandzikir, PID: 6902
    java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
        at java.util.ArrayList.get(ArrayList.java:437)
        at com.seadlab.doadandzikir.FavouriteList.AdapterFavList.onBindViewHolder(AdapterFavList.java:124)
        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6482)
        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6515)
        at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5458)
        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5724)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5563)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5559)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2229)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1556)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1516)
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:608)
        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3693)
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3410)
        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3962)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:610)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:132)
        at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
        at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1361)
        at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:869)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at com.android.internal.policy.DecorView.onLayout(DecorView.java:753)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2792)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2319)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
2019-07-20 09:54:52.825 6902-6902/com.seadlab.doadandzikir E/AndroidRuntime:     at android.view.Choreographer.doCallbacks(Choreographer.java:761)
        at android.view.Choreographer.doFrame(Choreographer.java:696)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Ben P. :

In your adapter, the collection list is the only list that's safe to access using position. Trying to call yukulList.get(position) is guaranteed to eventually throw an exception.

All of these lines in onBindViewHolder() are unsafe and should be changed:

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    // ...
        ((tidurViewHolder) holder).bind(storyList.get(position));
    // ...
        ((yukulViewHolder) holder).bind(yukulList.get(position));
    // ...
        ((homeViewHolder) holder).bind(homeList.get(position));
    // ...
}

You can access the "view type" value that you've returned from getItemViewType() by calling holder.getItemViewType(), and you can use that to determine the right type of view holder and item to use:

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    Object item = collection.get(position);
    int adapterPosition = holder.getAdapterPosition();

    if (holder.getItemViewType() == VIEW_TYPE_TIDUR){
        Story story = (Story) item;
        tidurViewHolder vh = (tidurViewHolder) holder;
        vh.bind(story);
        vh.setViewData(story, adapterPosition);
    } else if (holder.getItemViewType() == VIEW_TYPE_YUKUL){
        YukulModel yukul = (YukulModel) item;
        yukulViewHolder vh = (yukulViewHolder) holder;
        vh.bind(yukul);
        vh.viewDataYukul(yukul, adapterPosition);
    } else if (holder.getItemViewType() == VIEW_TYPE_HOME){
        HomeModel home = (HomeModel) item;
        homeViewHolder vh = (homeViewHolder) holder;
        vh.bind(home);
        vh.viewDataHome(home, adapterPosition);
    }
}

Note also that there's no need to actually pass holder.getAdapterPosition() into e.g. setViewData(), since you can simply call getAdapterPosition() from within the tidurViewHolder method.

And I would also say that you could combine your bind() and setViewData() calls into one, which would leave you with this:

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    Object item = collection.get(position);

    if (holder.getItemViewType() == VIEW_TYPE_TIDUR){
        ((tidurViewHolder) holder).bind((Story) item);
    } else if (holder.getItemViewType() == VIEW_TYPE_YUKUL){
        ((yukulViewHolder) holder).bind((YukulModel) item);
    } else if (holder.getItemViewType() == VIEW_TYPE_HOME){
        ((homeViewHolder) holder).bind((HomeModel) item);
    }
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=127010&siteId=1