2012-05-22 26 views
13

Bazı şeyler yapmak istiyorum. ListView'da tembel yükleme yapmak istiyorum. Benim ListView, yalnızca TextView içinde 10,000'den fazla veri & içerir. Bu yüzden liste etkinliğini başlattığımda tüm bu verileri ilk defa yükleyemiyorum. Bu verimli değil, bu yüzden listede ilk 20 veya 30 öğeyi yükleyebilirim. Ayrıca, üzerinde kaydırma yaptığımda ListView satırları yüklenir. Son endekste ListView'un son dizinine ulaştığımda, ilerleme çubuğunu koyacağım, yeni verinin yükleneceğini not edecektir, böylece o zaman yeni veriler son + 1 indeksi ile yüklenecektir. Bunu nasıl yapabilirim?Android cep telefonu açıktan yüklememe

+1

Eğer denedi göstermek olabilir bulabilirim? – gideon

+0

ya resmini buraya örnek olarak ekledim. Bunu kontrol et – Jai

+0

Picasso'ya ne dersiniz? Bu ihtiyacınızı karşılıyor mu? http://square.github.io/picasso/ – phi

cevap

19

Bunu, sonsuz Bağdaştırıcı uygulamasını kullanarak gerçekleştirebilirsiniz. Bu tam olarak istediğini yapar. Kaydırma başına yenilenecek satır sayısını da kısıtlayabilirsiniz. İşte buna bir bağlantıdır.,

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

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

Kullanmak için

, sen endlessness nasıl işleneceği konusunda ayrıntıları sağlamak için EndlessAdapter uzatın. Özellikle, gerçek bağdaştırıcınızdaki herhangi bir satırdan bağımsız olarak, başka bir yöntemde ana bağdaştırıcınıza gerçek verileri yüklerken, yer tutucu işlevi görecek bir satır Görünümü sağlayabilmeniz gerekir. Daha sonra, sizden biraz yardım alarak, yeni verilerde sorunsuzca geçiş yapar.

+0

Teşekkürler dostum, bunu deneyeyim. – Jai

+1

Link şimdi bozuk! :( –

0

çağıran işleve koymak //:

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

ve iç sınıfı:

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

sizin listeleri kaydırma yapın daha hızlı: -

  1. kullanılan koşullar sayısını azaltın bağdaştırıcınızın getView.
  2. Eğer günlükleri
  3. Add kaydırma fonksiyonu olsun çöp toplama uyarı sayısı (Kaydırma başına yenilenmesi satır sayısını kısıtlamak)
1

ListView için bir onScrollListener ekle azaltın. Kullanıcı kaydırdığında, ListView'in sonuna yaklaşıp açmadığını kontrol edin. Evet ise, daha fazla veri alın. Örnek olarak:

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); 
} 

Etkinlik:

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 !!! 
       } 
      }); 
     } 
    } 

Sen tam uygulanması at this link

İlgili konular