Ответ 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 */);
}
}