Что такое setTag и getTag в этом контексте?
Представления Android поддерживают «теги», которые представляют собой произвольные объекты, которые вы можете прикрепить к ним. Нет никакого реального определения для тегов, потому что они такие, какими вы хотите их видеть. Все они одинаково действительны:
view.setTag(2)
view.setTag("Hello world")
view.setTag(new Object())
что означает view.setTag (viewHolder)?
Вы присоединяете объект viewHolder
к view
в качестве его тега. Это не ничего не делает само по себе, но позволяет позже получить viewHolder
, вызвав (ViewHolder) view.getTag()
.
Зачем мне создавать закрытый класс с именем ViewHolder [...]
Когда вы работаете с ListView
адаптерами, есть две вещи, которые могут снизить производительность вашего приложения: вызов inflate()
и findViewById()
.
Вы можете обойти первый, используя переданный аргумент view
, когда он не равен нулю, и вызывая inflate()
, только если переданный в view
аргумент равен нулю. Вот этот бит вашего кода:
if (view == null) {
...
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(layout, null);
...
} else {
...
}
Вы можете обойти второе, используя этот «шаблон ViewHolder». Вы создаете объект (держатель вида), чтобы "удерживать" виды после их поиска. Вот этот бит вашего кода:
final ViewHolder viewHolder;
if (view == null) {
viewHolder = new ViewHolder();
...
viewHolder.txtName = (TextView) view.findViewById(R.id.songName_text);
viewHolder.txtSinger = (TextView) view.findViewById(R.id.singer_text);
viewHolder.playB = (ImageView) view.findViewById(R.id.play_png);
viewHolder.stopB = (ImageView) view.findViewById(R.id.stop_png);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
Как только этот блок будет завершен, у вас будет ViewHolder
экземпляр с именем viewHolder
, который вы можете использовать для прямого доступа к представлениям. Если переданный аргумент view
равен нулю, вы создаете держатель представления, заполняете , вызывая findViewById()
, и сохраняете , вызывая setTag()
. Если переданный аргумент view
не равен нулю, вы можете просто получить держатель представления, вызвав getTag()
.
Соберите все это вместе, и это означает, что вы можете написать код следующим образом:
viewHolder.txtName.setText(song.getName());
Вместо этого более медленного кода:
TextView txtName = view.findViewById(R.id.songName_text);
txtName.setText(song.getName());