安卓ListView懒加载

15

我想做一些事情。我希望在ListView中实现延迟加载。我的ListView包含超过10,000条仅为TextView的数据,所以当我启动列表活动时,我不能一次性加载所有数据,这不太有效率。因此,我只能在列表中加载前20或30个项目。当我滚动到ListView的某一行时,再去加载相应的数据。当我到达ListView的索引的最后一个时,我会将进度条放置在那里,并提示新数据已加载,此时会加载新的数据并将其与上一个索引相加。怎么做呢?


1
你能展示一下你尝试过什么吗? - gideon
我在这里添加了一张图片作为示例,请查看。 - Jai
Picasso怎么样?这个满足你的需求吗?http://square.github.io/picasso/ - kenju
4个回答

17
你可以通过使用无限适配器实现此功能。这正是你想要的。你还可以限制每次滚动要刷新的行数。这里有一个链接。

Android: 实现进度条和“正在加载...”以用于类似Android Market的无限列表

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

要使用它,您需要扩展EndlessAdapter以提供有关如何处理无限性的详细信息。具体而言,您需要能够提供一个行视图,独立于实际适配器中的任何行,该行视图将用作占位符,同时您可以在另一个方法中加载实际数据到主适配器中。然后,在您的帮助下,它会平稳地过渡到新数据。

谢谢,伙计。让我试试这个。 - Jai
6
链接现在已经失效了! :( - Ravi Dhoriya ツ
我必须将其标记为“不是答案”,因为目前它并没有回答问题。对此感到抱歉! - Ky -
https://github.com/commonsguy/cwac-endless 没有响应,出现404错误。 - LMK IND

2
将一个 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 !!!
                }
            });
        }
    }

你可以在这个链接中找到完整的实现:点击此处

2

让您的列表滚动更快:

  1. 减少在适配器的getView方法中使用的条件数量。
  2. 减少日志中出现的垃圾回收警告次数。
  3. 添加滚动功能(限制每次滚动要刷新的行数)。

0

//放在调用函数中:

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

    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接