2012-05-22 17 views
13

Ich möchte ein paar Sachen machen. Ich möchte lazy loading in ListView machen. Meine ListView enthalten mehr als 10.000 Daten & nur in TextView. also kann ich nicht alle diese Daten beim ersten Mal laden, wenn ich die Listenaktivität starte. Es ist nicht effizient, so kann ich zuerst 20 oder 30 Elemente in Liste laden. weiter werden die Zeilen der ListView geladen, wenn ich über sie blättern. Also, wenn ich letzten Index von ListView auf dem letzten Index erreiche, werde ich Fortschrittsbalken n setzen, es wird bemerken, dass die neuen Daten geladen werden, so dass zu dieser Zeit neue Daten mit dem letzten + 1 Index geladen werden. Wie kann ich das machen?Android listview lazy loading

+1

könnten Sie zeigen, was Sie haben versucht, finden kann? – gideon

+0

ya ich habe das Bild hier als Beispiel hinzugefügt ... überprüfen Sie dieses – Jai

+0

Wie wäre es mit Picasso? Entspricht das Ihrem Bedarf? http://square.github.io/picasso/ – phi

Antwort

19

Sie können dies erreichen, indem Sie endlose Adapter-Implementierung verwenden. Das macht genau das, was Sie wollen. Sie können auch die Anzahl der Zeilen begrenzen, die pro Bildlauf aktualisiert werden sollen. Hier ist ein Link zu.,

Android: Implementing progressbar and "loading..." for Endless List like Android Market

https://github.com/commonsguy/cwac-endless

es zu benutzen, Sie EndlessAdapter erweitern Einzelheiten zu geben, wie die Endlosigkeit zu handhaben. Insbesondere müssen Sie in der Lage sein, eine Zeilenansicht unabhängig von einer der Zeilen in Ihrem tatsächlichen Adapter bereitzustellen, die als Platzhalter dient, während Sie in einer anderen Methode die tatsächlichen Daten in Ihren Hauptadapter laden. Dann, mit ein wenig Hilfe von Ihnen, geht es nahtlos in die neuen Daten über.

+0

Danke, Alter, lass mich das versuchen. – Jai

+1

Link ist jetzt kaputt! :( –

0

// in Aufruf Funktion gesetzt:

@Override 
public View onCreateView(android.view.LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    ScrollListener scrollListener = new ScrollListener(); 
    listView.setOnScrollListener(scrollListener); 
} 

und innere Klasse:

class ScrollListener implements OnScrollListener 
{ 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
    { 
     int size = searchedPeople.size(); 
     if(isScrolled && totalItemCount != 0 && size < totalPeoples) 
     { 

      if(firstVisibleItem + visibleItemCount >= totalItemCount) 
      { 

        yourfunction(size, size + limit); // call service in your functioin 

       isScrolled = false; 
      } 
     } 

    } 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) 
    { 

    } 

} 
0

Machen Sie Ihre Listen blättern schneller: -

  1. Reduzieren Sie die Anzahl der verwendeten Bedingungen in der getView Ihres Adapters.
  2. Reduzieren Sie die Anzahl der Garbage Collection Warnungen, die Sie in den Protokollen
  3. Add-Scroll-Funktion erhalten (schränken die Anzahl der Zeilen pro Scrollaufgefrischt werden)
1

hinzufügen onScrollListener zur Listenansicht. Wenn der Benutzer scrollt, prüfen Sie, ob sich das ListView dem Ende nähert. Wenn ja, rufen Sie weitere Daten ab. Als Beispiel:

public abstract class LazyLoader implements AbsListView.OnScrollListener { 

    private static final int DEFAULT_THRESHOLD = 10 ; 

    private boolean loading = true ; 
    private int previousTotal = 0 ; 
    private int threshold = DEFAULT_THRESHOLD ; 

    public LazyLoader() {} 

    public LazyLoader(int threshold) { 
     this.threshold = threshold; 
    } 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, 
         int visibleItemCount, int totalItemCount) { 
     if(loading) { 
      if(totalItemCount > previousTotal) { 
       // the loading has finished 
       loading = false ; 
       previousTotal = totalItemCount ; 
      } 
     } 

     // check if the List needs more data 
     if(!loading && ((firstVisibleItem + visibleItemCount) >= (totalItemCount - threshold))) { 
      loading = true ; 

      // List needs more data. Go fetch !! 
      loadMore(view, firstVisibleItem, 
        visibleItemCount, totalItemCount); 
     } 
    } 

    // Called when the user is nearing the end of the ListView 
    // and the ListView is ready to add more items. 
    public abstract void loadMore(AbsListView view, int firstVisibleItem, 
            int visibleItemCount, int totalItemCount); 
} 

Aktivität:

public class MainActivity extends AppCompatActivity { 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      setContentView(R.layout.main_layout); 
      ListView listView = (ListView) findViewById(R.id.listView); 

      listView.setOnScrollListener(new LazyLoader() { 
       @Override 
       public void loadMore(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
        // Fetch your data here !!! 
       } 
      }); 
     } 
    } 

Sie die vollständige Implementierung at this link