Android.widget.textview нельзя применять к android.view.view

Я пытаюсь следовать официальному документу Android по созданию списков и карт.

В третьем (сверху) примере кода на странице приведен пример того, как реализовать MyAdapter, который обеспечивает доступ к элементам в наборе данных, создает представления для элементов и заменяет их, когда их больше не видно.

Проблема в том, что на onCreateViewHolder они передают v, который является View, к ViewHolder, который был реализован непосредственно перед этим. Конструктор ViewHolder ожидает TextView. Android Studio 1.0, чем кричит:

android.widget.textview cannot be applied to android.view.view

Что не так?

Ответ 1

Это новый паттерн RecyclerView. В нем вы используете 3 компонента:

ViewHolder объект, который расширяет RecyclerView.ViewHolder. В нем вы определяете поля View и конструктор, который принимает View v в качестве параметра. в этом конструкторе используйте v.findViewById(), чтобы связать все эти представления

onCreateViewHolder() делает две вещи - сначала вы надуваете объект View из макета. Затем вы создаете ViewHolder (тот, который вы определили выше) с этим раздутым представлением, переданным в качестве параметра.

Наконец, onBindViewHolder() передается объект ViewHolder, в который вы помещаете содержимое во все поля, определенные в первом и связанные на третьем шаге.

Что касается приведенного вами примера, здесь есть ошибка. Метод onCreateViewHolder() должен выглядеть следующим образом:

// Create new views (invoked by the layout manager)
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType) {
    // create a new view
    View v = LayoutInflater.from(parent.getContext())
                           .inflate(R.layout.my_text_view, parent, false);
    // set the view size, margins, paddings and layout parameters
    ...
    ViewHolder vh = new ViewHolder((TextView)v);  //You need a cast here
    return vh;
}

ИЛИ ViewHolder должен определить конструктор, ожидающий объект View (на самом деле это более правильно):

public static class ViewHolder extends RecyclerView.ViewHolder {
    // each data item is just a string in this case
    public TextView mTextView;
    public ViewHolder(View v) {            
        mTextView = (TextView) v.findViewById(/* some ID */);
    }
}