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