Как работает метод 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();
}
}
}