1

Пытаюсь сделать загрузку разных макетов для пунктов списка. Изучаю, так сказать, пошагово. Смог сделать загрузку разных layout в пределах одного viewholder, но это не работает, если в разметке отсутствует view с заданным id. Для этого нужно подгружать, в зависимости от условия, разные viewholder. Пытаюсь реализовать с помощью данного ответа, но выдает такое ругательство: введите сюда описание изображения

Суть ошибки, в общем то, ясна, но вот как исправлять - абсолютно непонятно. Делаю, вроде, все по примеру. Вот код адаптера, onBindViewHolder еще не дописал, потому что застрял на этой ошибке. Если же использовать один холдер, то layout'ы прекрасно меняются по условию.

public class MyListCursorAdapter extends CursorRecyclerViewAdapter<MyListCursorAdapter.ViewHolder>
{

public MyListCursorAdapter(Context context,Cursor cursor)
{
    super(context,cursor);
}

public static class ViewHolder extends RecyclerView.ViewHolder
{
    public TextView mTextView;
    public ViewHolder(View view) {
        super(view);
        mTextView = (TextView) view.findViewById(R.id.name);
    }
}

public static class ViewHolder1 extends RecyclerView.ViewHolder
{
    public TextView mTextView1;
    public ViewHolder1(View view) {
        super(view);
        mTextView1 = (TextView) view.findViewById(R.id.name1);
    }
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
    ViewHolder vh;
    View itemView;
    switch (viewType)
    {
        case 0 :
            itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
            vh = new ViewHolder(itemView);
        break;
        case 1 :
            itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_2, parent, false);
            vh = new ViewHolder1(itemView);
        break;
        default:
            itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_3, parent, false);
            vh = new ViewHolder(itemView);
        break;
    }
    return vh;
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, Cursor cursor)
{
    MyListItem myListItem = MyListItem.fromCursor(cursor);
    viewHolder.mTextView.setText(myListItem.getName());
}
}
Howling
  • 527
  • 1
    Не называйте свои классы так же, как стандартные, чтобы не путать себя, людей и компилятор. Сделайте ViewHolder1 и ViewHolder2, например. – woesss Dec 14 '17 at 08:16

1 Answers1

4

Вы указали, что ваш адаптер должен работать только с классом MyListCursorAdapter.ViewHolder. Засим компилятор и отказывается разрешить вам другой использовать.

Расширьте перечень классов, с коими может работать адаптер, указав базовый ViewHolder - RecyclerView.ViewHolder - в объявлении класса, возвращаемом значении метода onCreateViewHolder и в аргументе метода onBindViewHolder