Android: FindViewByid из ImageView (пользовательский адаптер)

StackOverflow https://stackoverflow.com/questions/5369252

  •  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 () адаптер, возможно, еще не запускался и приложил это представление к иерархии. И если это произошло, это еще не закончило манипулировать этим.

Я бы попытался ускорить ваш адаптер, прежде чем приблизиться ко второму вопросу, так как я не уверен, что даже можно сделать это безопасно или точно, не отказавшись от использования адаптера.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top