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