Как работает метод getItemViewType(int)?

В данном коде в recyclerView выводится два типа сток. Мне не очень понятен принцип работы этого метода:

    @Override
    public int getItemViewType(int position) {
        if (position % 2 == 0) {
            return 0;
        }
        return 1;
    }

Не понимаю, как он связывается с двумя разными ViewHolder и вообще принцип его работы

public class CrimeListFragment extends Fragment {

        private RecyclerView mCrimeRecyclerView;
        private CrimeAdapter mAdapter;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment__crime_list, container,
                    false);
            mCrimeRecyclerView = (RecyclerView) view
                    .findViewById(R.id.crime_recycler_view);
            mCrimeRecyclerView.setLayoutManager(new LinearLayoutManager
                    (getActivity()));

            updateUI();

            return view;
        }

        private void updateUI() { //здесь добавляются данные, которые будут выведены на экран в recycleView
            CrimeLab crimeLab = CrimeLab.get(getActivity());
            List<Crime> crimes = crimeLab.getCrimes();
            mAdapter = new CrimeAdapter(crimes);
            mCrimeRecyclerView.setAdapter(mAdapter);
        }

        private class CrimeHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

            private TextView mTitleTextView;
            private TextView mDateTextView;

            private Crime mCrime;

            public CrimeHolder(LayoutInflater inflater, ViewGroup parent) {
                super(inflater.inflate(R.layout.list_item_crime, parent, false));
                    itemView.setOnClickListener(this); //важный момент, без которого кликать не получиться

                mTitleTextView = (TextView) itemView.findViewById(R.id.crime_title);
                mDateTextView = (TextView) itemView.findViewById(R.id.crime_date);
            }

            public CrimeHolder(View inflate) { // не уверен, что этот конструктор нужен
                super(inflate);
            }

            public void bind(Crime crime) {
                mCrime = crime;
                mTitleTextView.setText(mCrime.getTitle());
                mDateTextView.setText(mCrime.getDate().toString());
            }

                @Override
                public void onClick(View view) {
                Toast.makeText(getActivity(),
                        mCrime.getTitle() + " clicked!", Toast.LENGTH_SHORT)
                        .show();
            }
        }

        private class CrimeHolderPolice extends CrimeHolder implements View.OnClickListener {

            private TextView mTitleTextView;
            private TextView mDateTextView;
            private ImageView mImageView;
            private TextView mPolice;

            private Crime mCrime;

            public CrimeHolderPolice(LayoutInflater inflater, ViewGroup parent) {
                super(inflater.inflate(R.layout.lict_item_crime_police, parent, false));
                itemView.setOnClickListener(this); //важный момент, без которого кликать не получиться

                mTitleTextView = (TextView) itemView.findViewById(R.id.crime_title);
                mDateTextView = (TextView) itemView.findViewById(R.id.crime_date);
                mImageView = (ImageView) itemView.findViewById(R.id.image);
                mPolice = (TextView) itemView.findViewById(R.id.police);
            }

            public void bind(Crime crime) {
                mCrime = crime;
                mTitleTextView.setText(mCrime.getTitle());
                mDateTextView.setText(mCrime.getDate().toString());
                mPolice.setText(mCrime.getRequiresPolice().toString());
            }

            @Override
            public void onClick(View view) {
                Toast.makeText(getActivity(),
                        mCrime.getTitle() + " clicked!", Toast.LENGTH_SHORT)
                        .show();
            }
        }

        private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder> {

            private List<Crime> mCrimes;

            public CrimeAdapter(List<Crime> crimes) {
                mCrimes = crimes;
            }

            @Override
            public int getItemViewType(int position) {
                if (position % 2 == 0) {
                    return 0;
                }
                return 1;
            }

            @NonNull
            @Override
            public CrimeHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // создаёт элемент ViewHolder
                LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
                if (viewType == 0) {
                return new CrimeHolder(layoutInflater, parent);
                }
                return new CrimeHolderPolice(layoutInflater, parent);

            }

            @Override
            public void onBindViewHolder(@NonNull CrimeHolder holder, int position) { // получает объект ViewHolder и позицию, связывеат данные о позиции с
                // представлением View объекта ViewHolder, чтобы выполнить связывание, адаптер заполняет View в соответствии с данными объекта модели

                if (position % 2 == 0) {
                    Crime crime = mCrimes.get(position); //Присваивает переменной crime элемент с индексом position
                    holder.bind(crime); // отправляет crime в bind, чтобы добавить данные в элементы выводимого на экран списка
                } else {
                    Crime crime = mCrimes.get(position); //Присваивает переменной crime элемент с индексом position
                    holder.bind(crime);
                }
            }

            @Override
            public int getItemCount() { // запрашивает общее колличество элементов в списке
                return mCrimes.size();
            }
        }
    }

Ответы (0 шт):