2015-08-30 2 views
0

Я использую ListView для отображения списка из 30 продуктов.Почему ListView всегда перезагружается на

protected class ListProductAdapter extends ArrayAdapter<Product> 
     implements View.OnClickListener { 
    ... 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

Я заметил, что когда я показываю свою деятельность, она сначала вызывает GetView 6 раз, а затем, если я прокрутите вниз, GetView будет называться, чтобы отобразить другие продукты, но если я прокрутки вверх, GetView вызывается снова продукт, для которого getView уже был вызван. Невозможно ли получить его в памяти, чтобы не перерасчитывать все, что я прокручиваю вниз и вверх?

+1

Показать полный код вашего адаптера. – eleven

ответ

2

ListView перерабатывает свои представления точно так, что вам не нужно постоянно просматривать представление для каждого элемента в памяти, но он передает старый View как convertView, поэтому его можно повторно использовать и не нужно повторно использовать, раздуты каждый раз. См. here.

1

Вот как ListView работ. Он управляет несколькими видами и вызовами getView(int, View, ViewGroup) всякий раз, когда ему нужно настроить один вид. Однако это не относится ко многим представлениям. Возможно, вы сможете держать все в памяти, но это не намерение.

Если convertView является null, вам необходимо создать список (первые 6 вызовов getView). Когда вы начнете прокрутку, список предоставит вам (уже инициализированный) convertView, который вам нужно будет заполнить только теми данными, которые вы хотите отобразить.

См. documentation of getView для подробного объяснения.