簡體   English   中英

Android listview延遲加載

[英]Android listview lazy loading

我想做點什么。 我想在ListView進行延遲加載。 我的ListView包含超過10,000個數據,僅在TextView 所以當我啟動列表活動時,我無法在第一次加載所有數據。 它效率不高所以我可以在列表中加載前20或30個項目。 當我滾動它們時,會加載ListView的行。 所以當我在最后一個索引上到達ListView的最后一個索引時,我會輸入進度條n它會注意到新數據被加載,所以那時新數據將加載最后一個索引。 我怎樣才能做到這一點?

您可以通過使用無限的Adapter實現來實現此目的。 這正是你想要的。 您還可以限制每個滾動要刷新的行數。 這是一個鏈接。,

Android:為Android Market等無盡列表實現進度條和“加載...”

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

要使用它,您可以擴展EndlessAdapter以提供有關如何處理無盡的詳細信息。 具體來說,您需要能夠提供獨立於實際適配器中任何行的行View,它將用作占位符,而在另一種方法中,您將實際數據加載到主適配器。 然后,在您的幫助下,它可以無縫轉換新數據。

讓您的列表滾動更快: -

  1. 減少適配器的getView中使用的條件數。
  2. 減少日志中收到的垃圾收集警告的數量
  3. 添加滾動功能(限制每個滾動要刷新的行數)

onScrollListener添加到ListView。 當用戶滾動時,檢查ListView是否接近其結束。 如果是,則獲取更多數據。 舉個例子 :

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

活動:

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

您可以在此鏈接中找到完整的實施

//放入調用函數:

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

和內在階級:

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)
    {

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM