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

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

Другие вопросы по тегам