2016-07-13 10 views
5

Mam RecyclerView z dużą kolekcją do niego przypisaną, powiedzmy ponad 500 pozycji. Po wywołaniu onBindViewHolder wykonuję asynchroniczne żądanie HTTP, aby załadować niektóre dane.Widok RecyclerView i tło z dużą kolekcją przedmiotów

Ale kiedy przewijam naprawdę szybko listę, w jaki sposób mogę anulować żądania dla wszystkich przedmiotów, które nie są już widoczne? Widzę 100-tki wniosków rozpocząć w tle ze względu na sposób ładowania RecyclerView, myślę, że na BindViewHolder jest wywoływana dla każdego elementu przewijania przeszłości?

Zastanawiam się, aby uruchomić żądanie w postaci onBindViewHolder, które czeka 500 ms, a jeśli element powiązany z nim jest nadal w widoku/wciąż taki sam, to rozpoczyna żądanie asynchroniczne. Czy to działa? Jeśli tak, to w jaki sposób mogę sprawdzić, czy przedmiot jest nadal widoczny z poziomu adaptera?

Jaki jest właściwy sposób rozwiązania tego problemu?

+0

można użyć niekończące przewijania design. Na przykład najpierw załadujesz 50 przedmiotów. Jeśli użytkownik dotrze do dna, a następnie załaduje 50 kolejnych. Mam pewne dziwne błędy podczas używania 'RecyclerView' z wywołaniem asynchronicznym. Tak więc nie polecam tego robić. – Joshua

Odpowiedz

6

Można zrobić OnScrollListener dla RecyclerView:

public void onScrollStateChanged(AbsListView view, int scrollState) { 
    if (scrollState == SCROLL_STATE_IDLE){ 
     int firstVisibleItem = view.getFirstVisiblePosition(); 
     int lastVisiblePosition = view.getLastVisiblePosition(); 

     //call request from firstVisibleItem to lastVisiblePosition 

    } 
} 
+0

Dzięki. Czy za pomocą tej metody aktualizuję kolekcję bezpośrednio do mojego adaptera RecyclerView lub czy uzyskuję dostęp do narzędzia ViewHolder i aktualizuję je? – lahsrah

+0

Tutaj można wywołać funkcję w adapterze, aby załadować dane (przekazać pozycję widoku). Możesz napisać dowolną rzecz w funkcji, wejść do przeglądarki lub nie. – phongvan

+0

Mam to do pracy, aby zaktualizować Adapter, ale nie sądzę, jego skuteczne. Nie chcę ładować wszystkich danych dla wszystkich elementów w moim adapterze, wolałbym tylko aktualizować poszczególne obiekty posiadacza widoku. Jaki jest czysty sposób dostępu do uchwytów widoku z tego miejsca? – lahsrah

0

można użyć setTag() w View zapisać odwołanie połączenia, jak to

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    HttpURLConnection httpURLConnection; 
    if (holder.itemView.getTag() != null) { 
     httpURLConnection = (HttpURLConnection)holder.itemView.getTag(); 
     //close the connection 
     httpURLConnection.disconnect(); 
    } 
    // create your connection 
    httpURLConnection = new HttpURLConnection(); 
    holder.itemView.setTag(httpURLConnection); 
} 
Powiązane problemy