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


    本文选自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
  • 相关阅读:
    4Windows程序设计 文本输出
    Dapr牵手.NET学习笔记:可观测性分布式跟踪
    Dapr牵手.NET学习笔记:Actor小试
    Dapr牵手.NET学习笔记:绑定
    Dapr牵手.NET学习笔记:发布订阅
    jenkins修改默认的工作空间
    Jenkins自动化编译部署vue项目至远程服务器
    Linux系统下安装Nginx,并反向代理运行vue项目
    Jenkins构建打包vue项目后丢失静态资源文件
    Jenkins修改显示语言为中文
  • 原文地址:https://www.cnblogs.com/aikongmeng/p/3697356.html
Copyright © 2020-2023  润新知