Android的ListView的延迟加载(Android listview lazy loadin

2019-06-24 16:25发布

我想要做一些东西。 我想要做的懒加载中ListView 。 我的ListView包含超过10000个数据和只在TextView 。 所以当我启动列表活动我无法加载在第一次所有的数据。 它的效率不高,所以我可以加载首先在列表20个或30个项目。 进一步的行ListView ,当我在滚动它们被加载。 所以,当我在最后指数达到ListView上最后一个索引,我就会把进度ñ它会注意到,新的数据被加载,所以当时的新数据将负载与去年+ 1指数。 我怎样才能做到这一点?

Answer 1:

您可以通过使用无尽的适配器实现实现这一目标。 这正是你想要做什么。 您还可以限制每个滚动被刷新的行数。 这里是一个链接,

安卓:像Android Market的无尽列表实施进度和“载入中...”

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

要使用它,您扩展EndlessAdapter提供有关如何处理的无穷无尽的细节。 具体来说,您需要能够提供一排景观,独立于任何在您的实际适配器行的,将作为在你的占位符,在另一种方法,负载的实际数据到您的主适配器。 然后,从你的帮助不大,它的无缝切换的新数据。



Answer 2:

让你的列表中滚动更快: -

  1. 减少在使用条件的数量getView适配器的。
  2. 减少您在日志中获取的垃圾收集警告的数量
  3. 添加滚动功能(限制行数每滚动被刷新)


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

你可以找到完整实现在此链接



Answer 4:

//放在调用函数:

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

    }

}


文章来源: Android listview lazy loading