如何实现滑动加载更多数据?

本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术。本文将讲解如何实现循环list。


Isaac Waller:

当list滑动到底时,我怎样去操作,可以加载更多的item?

Josef Pfleger:(最佳方案)

一个解决方案是,执行OnScrollListener,用onScroll方法,在适当的环境中调整ListAdapter(例如,增加item)。

下面的ListActivity会从40开始,在用户滚动到list尾部时,显示整数list,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Test extends ListActivity implements OnScrollListener {
 
     Aleph0 adapter = new Aleph0();
 
     protected void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setListAdapter(adapter);
         getListView().setOnScrollListener( this );
     }
 
     public void onScroll(AbsListView view,
         int firstVisible, int visibleCount, int totalCount) {
 
         boolean loadMore = /* maybe add a padding */
             firstVisible + visibleCount >= totalCount;
 
         if (loadMore) {
             adapter.count += visibleCount; // or any other amount
             adapter.notifyDataSetChanged();
         }
     }
 
     public void onScrollStateChanged(AbsListView v, int s) { }   
 
     class Aleph0 extends BaseAdapter {
         int count = 40; /* starting amount */
 
         public int getCount() { return count; }
         public Object getItem(int pos) { return pos; }
         public long getItemId(int pos) { return pos; }
 
         public View getView(int pos, View v, ViewGroup p) {
                 TextView view = new TextView(Test. this );
                 view.setText( "entry " + pos);
                 return view;
         }
     }
}

如果程序运转时间较长,最好使用单独线程。

saschoar:

我的这种方法是基于OnScrollListener界面,但这种方法在低端设备上的滚动效果更佳,因为在滚动操作中,计算出所有结果是难以执行的。

1. 让ListFragment或者ListActivity执行OnScrollListener

2.    在class上增加如下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
         int visibleItemCount, int totalItemCount) {
     //leave this empty
}
 
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
     if (scrollState == SCROLL_STATE_IDLE) {
         if (listView.getLastVisiblePosition() >= listView.getCount() - threshold) {
             currentPage++;
             //load more list items:
             loadElements(currentPage);
         }
     }
}

currentPage是应该加到list上的数据源,threshold是list item的数量(从尾部算起)。如果将threshold设置成0,用户不得不滚动到最后去加载更多item。

3.(可选)"load-more check"只会在用户停止滚动时才会弹出。为了使用方便,你可以在list末尾,使用listView.addFooterView(yourFooterView)增加一个陪在指示器。

举例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version= "1.0" encoding= "utf-8" ?>
 
<RelativeLayout xmlns:android= "http://schemas.android.com/apk/res/android"
     android:id= "@+id/footer_layout"
     android:layout_width= "fill_parent"
     android:layout_height= "wrap_content"
     android:padding= "10dp" >
 
     <ProgressBar
         android:id= "@+id/progressBar1"
         android:layout_width= "wrap_content"
         android:layout_height= "wrap_content"
         android:layout_centerVertical= "true"
         android:layout_gravity= "center_vertical" />
 
     <TextView
         android:layout_width= "wrap_content"
         android:layout_height= "wrap_content"
         android:layout_centerVertical= "true"
         android:layout_toRightOf= "@+id/progressBar1"
         android:padding= "5dp"
         android:text= "@string/loading_text" />
 
</RelativeLayout>

4.(可选)最后,如果通过item和page数量都没有增加的话,可以通过listView.removeFooterView(yourFooterView)重置配载指示器。

darbat:

你可以凭借onScrollListener检测list末端,运行代码如下:

1
2
3
4
5
6
7
8
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
     if (view.getAdapter() != null && ((firstVisibleItem + visibleItemCount) >= totalItemCount) && totalItemCount != mPrevTotalItemCount) {
         Log.v(TAG, "onListEnd, extending list" );
         mPrevTotalItemCount = totalItemCount;
         mAdapter.addMoreData();
     }
}

另一种方法是:

1
2
3
4
5
6
public View getView(int pos, View v, ViewGroup p) {
         if (pos==getCount()-1){
             addMoreData(); //should be asynctask or thread
         }
         return view;
}

使用这种方法,你还需要增加addMoreData()条件。

在list中加入所有元素后,你还需要调用适配器中notifyDataSetChanged() 来升级View。

文章选自StackOverFlow社区,鉴于其内容对于开发者有所帮助,现将文章翻译于此,供大家参考及学习。9Tech将每日持续更新,读者可点击StackOverflow(简称:SOF)精选问答汇总查看全部译文内容。同时,我们也招募志同道合的技术朋友共同翻译,造福大家!报名请发邮件至zhangqi_wj@cyou-inc.com。

原文链接:http://stackoverflow.com/questions/1080811/android-endless-list

来自:9Tech

转载于:https://www.cnblogs.com/aikongmeng/p/3697356.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值