Если вы переопределяете newView()
и bindView()
, вам не нужно ничего делать в getView()
. CursorAdapter
имеет реализацию getView()
, которая делегирует newView()
и bindView()
для принудительного повторного использования строк.
findViewById()
часто вызывается во время прокрутки ListView
, что может снизить производительность. Даже когда Adapter
возвращает раздутое представление для переработки, вам все равно нужно искать элементы и обновлять их. Чтобы избежать этого, полезен шаблон ViewHolder
.
Вот пример шаблона ViewHolder
, реализованного для приложения погоды:
public class ForecastAdapter extends CursorAdapter {
public ForecastAdapter(Context context, Cursor cursor, int flags) {
super(context, cursor, flags);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = LayoutInflater.from(context).inflate(
R.layout.list_item_forecast, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
view.setTag(viewHolder);
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder viewHolder = (ViewHolder) view.getTag();
long date = cursor.getLong(ForecastFragment.COL_WEATHER_DATE);
viewHolder.dateView.setText("Today");
String weatherForecast =
cursor.getString(ForecastFragment.COL_WEATHER_DESC);
viewHolder.descriptionView.setText(weatherForecast);
double high = cursor.getFloat(ForecastFragment.COL_WEATHER_MAX_TEMP);
viewHolder.highTempView.setText("30");
double low = cursor.getFloat(ForecastFragment.COL_WEATHER_MIN_TEMP);
viewHolder.lowTempView.setText("24");
int weatherConditionId =
cursor.getInt(ForecastFragment.COL_WEATHER_CONDITION_ID);
viewHolder.iconView.setImageResource(R.drawable.ic_snow);
}
/** Cache of the children views for a list item. */
public static class ViewHolder {
public final ImageView iconView;
public final TextView dateView;
public final TextView descriptionView;
public final TextView highTempView;
public final TextView lowTempView;
public ViewHolder(View view) {
iconView =
(ImageView) view.findViewById(R.id.item_icon);
dateView =
(TextView) view.findViewById(R.id.item_date_textview);
descriptionView =
(TextView) view.findViewById(R.id.item_forecast_textview);
highTempView =
(TextView) view.findViewById(R.id.item_high_textview);
lowTempView =
(TextView) view.findViewById(R.id.item_low_textview);
}
}
}