Android: FindViewByid из ImageView (пользовательский адаптер)
-
27-10-2019 - |
Вопрос
Я пытался повторно установить размер изображения. Я использую пользовательский адаптер.
View row = convertView;
if (row == null) {
LayoutInflater inflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.grid_item, null);
}
thumb = (ImageView) row.findViewById(R.id.bookThumb);
Когда я использую ImageView thumb = (imageView) row.findviewbyid (r.id.bookthumb); Внутри индивидуального адаптера он отлично работает, но потому что он зацикливается на каждом ряду, он делает прокрутку очень медленной.
Итак ... теперь я пытаюсь получить Thumb = (ImageView) row.findviewbyid (r.id.bookthumb); Из моей основной деятельности и устанавливаю его размер, но я получаю NULL, и поэтому сила приложения закрывается.
Пытался:
LinearLayout layout = (LinearLayout) findViewById(R.id.gridLayout);
ImageView thumbRow = (ImageView)layout.findViewById(R.id.bookThumb);
Также попытался:
// gv is the gridview (R.id.gridview)
ImageView thumbRow = (ImageView)gv.findViewById(R.id.bookThumb);
Всегда получай ноль.
Цените любую помощь! чувствует, что упускаю что -то глупое :)
Решение
Я думаю, что проблема происходит в двух местах.
Во -первых, исходная проблема. Ваш адаптер медленный из -за вызова findviewbyid. Вы используете переработанный вид, и это здорово, но вы все равно проходите вид на миниатюру. Существует техника, неформально называемая Viewholder, которая в основном делает его более прямым вызовом.
Таким образом, вместо того, чтобы просто использовать переработанное представление в качестве места для начала заполнения данных, также прикрепите к нему некоторую структуру, чтобы вы могли предварительно переполировать элементы, которые хотите манипулировать
if (row == null) {
LayoutInflater inflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.grid_item, null);
row.setTag(row.findViewById(R.id.bookThumb));
}
thumb = (ImageView) row.getTag();
Здесь мы называем непосредственно переменной и не выполняется. Это должно быть намного быстрее.
Также вторая проблема, NullPointerExcepton.
Я думаю, что это двусмысленность идентификаторов, смешанных с той точки зрения, в которой вы называете FindViewByid в своей основной деятельности. Вы не можете сделать это хорошо в своей MainActivity, особенно если задействована прокрутка, так как вам придется перехватить призыв к визуализации в представлении адаптера. Большинство обратных вызовов уже находятся в основном потоке, поэтому две вещи не могут произойти в одном и одновременно в этом потоке.
Таким образом, в тот момент вы назвали FindViewById () адаптер, возможно, еще не запускался и приложил это представление к иерархии. И если это произошло, это еще не закончило манипулировать этим.
Я бы попытался ускорить ваш адаптер, прежде чем приблизиться ко второму вопросу, так как я не уверен, что даже можно сделать это безопасно или точно, не отказавшись от использования адаптера.