6

Mam ListView, który wyświetla w każdym wierszu obraz pobrany z internetu i ciąg znaków.Android - ListView - wywołanie getView() na żądanie

Generalnie działa dobrze. Jednak chcę przejąć kontrolę na drodze, gdy widoki (rzędy) są zawyżone. Domyślnie, gdy wiersz jest widoczny, wywoływana jest metoda adaptera getView().

To oczywiście nie jest jednym z najlepszych zachowań, bo jeśli mam ListView z kilkuset płyt, i muszę dotrzeć do tych na dole, podczas przewijania ListView metoda getView() zostanie wywołana dla każdego rzędu, aż dojdę do stopki.

Więc chcę zadzwonić getView dopiero po przewinięciu i ListView jest wstrzymana/stan czuwania, ale nie mam pojęcia, jak go o to:

Oto jak zacząłem:

listView.setOnScrollListener(new OnScrollListener() { 
    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     if(scrollState==SCROLL_STATE_IDLE){ 
      // Invoke get view only on visible items 
     } 
    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, 
      int visibleItemCount, int totalItemCount) { 

    } 
}); 

to getView mojego adaptera:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    ViewHolder holder; 

    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.row, parent, false); 

     holder = new ViewHolder(); 
     holder.title = (TextView) convertView.findViewById(R.id.textView); 
     holder.image = (ImageView) convertView.findViewById(R.id.imageView); 
     holder.position = position; 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 


    holder.title.setText(data.get(position).getTitle()); 
    holder.image.setImageResource(R.drawable.ic_launcher); 
    new LoadImageAsync(data.get(position).getUrl(), holder.image).execute(); 

    return convertView; 
} 

Proszę dać mi jakieś wskazówki, w którym należy szukać w tym celu: Call getView() tylko po przewinięciu, a tylko dla visib le przedmioty.

+1

sprawdź ApiDemos, sekcja Efektywna przejściówka –

+0

@TomislavNovoselec, dziękuję za podpowiedź. To jest warte odwrócenia uwagi. –

Odpowiedz

4

Niedawno przeczytałem artykuł na ten temat ... here. Nie próbowałem tego, ale wydaje się, że jest to teoria dźwięku.

Zasadniczo opowiadają się za dodaniem wartości logicznej, której używasz do śledzenia, czy przewijasz i używasz tego jako flagi w adapterze. Jeśli boolean ma wartość true (przewijacie), narysuj tylko widoki tekstu w układzie. Jeśli false (przestałeś przewijać), rysujesz wszystko.

Poinformujesz adapter, aby przerysował widoczne widoki, gdy nie jest przewijany przy użyciu notifyDataSetChanged().

+0

Dzięki za link. Ten artykuł w połączeniu z przykładami z demonstracji API pomógł mi osiągnąć mój cel. Teraz mam najbardziej inteligentny adapter w historii. :) –

+0

Dziękuję, wywołanie notifyDataSetChanged() po dodaniu dodatkowych elementów w asynchronicznym wywołaniu pomogło! (używając zapytania Android) –

Powiązane problemy