Android: findViewById для ImageView (пользовательский адаптер) - PullRequest
1 голос
/ 20 марта 2011

Я пытался заново установить размер 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 Ответ

3 голосов
/ 20 марта 2011

Я думаю, что проблема в двух местах.

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

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

...