Ответ 1
Мой вопрос в том, что CursorAdapter повторно использует представления изнутри реализация шаблона ViewHolder или его кодирование, поскольку мы обычно выполняются в пользовательском ArrayAdapter?
Я не уверен, что вы ссылаетесь на шаблон ViewHolder
. Если вы имеете в виду, что каждый раз, когда класс хэппера кэшируется, просматривая просмотр (и устанавливая его как тег для строки View
), тогда ответ будет отрицательным. Если вы хотите реализовать этот шаблон, вам нужно будет установить держатель (посмотрите на представления в представлении строк с помощью findViewById
) в методе newView
, а затем установите его как тег для представления строки. Затем в методе bindView
вы можете вызвать getTag
, извлечь держатель и использовать его. Пример:
// custom CursorAdapter ...
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View rowView = ((LayoutInflater) context
.getSystemService("layout_inflater")).inflate(
R.layout.row_layout, parent, false);
ViewHolder holder = new ViewHolder();
holder.v1 = rowView.findViewById(R.id.v1);
holder.v2 = rowView.findViewById(R.id.v2);
rowView.setTag(holder);
return rowView;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder) view.getTag();
// use the holder filled with views
// hlder.v1.setSomething
}
class ViewHolder {
View v1, v2;
}
// ...
Если вы ссылаетесь на повторное использование convertView
(например, в адаптерах, отличных от Cursor
), тогда ответ "да", метод getView
реализует этот шаблон, вам просто нужно реализовать newView
и bindView
, и вам гарантировано получить представление, которое было переработано (если возможно в этот момент).