У меня есть простой фрагмент кода для реализации пользовательского списка.
Мой код выглядит следующим образом:
WeatherAdapter.java:
public class WeatherAdapter extends ArrayAdapter<weather>{
Context mcontext;
int mlayoutResourceId;
weather mdata[] = null;
View row;
public WeatherAdapter(Context context, int layoutResourceId, weather[] data) {
super(context, layoutResourceId, data);
mlayoutResourceId = layoutResourceId;
mcontext = context;
mdata = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
row = convertView;
WeatherHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ( (Activity) mcontext).getLayoutInflater();
row = inflater.inflate(mlayoutResourceId, parent, false);
holder = new WeatherHolder(row);
row.setTag(holder);
}
else
{
holder = (WeatherHolder)row.getTag();
}
weather w = mdata[position];
holder.txtTitle.setText(w.mtitle);
holder.imgIcon.setImageResource(w.micon);
return row;
}
WeatherHolder.java
class WeatherHolder
{
ImageView imgIcon;
TextView txtTitle;
public WeatherHolder(View v){
imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
txtTitle = (TextView)row.findViewById(R.id.txtTitle);
}
}
}
Я видел так много ответов на SO и других сайтах, и я понял механизм рециркуляции списка.
Я также понял, что из зрителя мы можем удерживать дочерние представления в адаптере, и нам не нужно много раз называть findViewById()
. Итак, это для оптимизации.
Но у меня есть только путаница в методах setTag(holder)
и getTag()
. Из этого вопроса, я узнал, что он предназначен для создания пары ключ-значение на нескольких объектах, чтобы мы могли легко получить к ним доступ. Но я не понимаю, почему они здесь требуются... потому что у нас нет нескольких объектов-держателей... только мы должны каждый раз менять переменные-держатели. можно ли здесь закодировать без использования setTag
и getTag
?
может ли кто-нибудь лучше объяснить, что делать setTag
и getTag
здесь?