ListView上拉刷新,数据的分批加载小demo

原创 2016年05月31日 20:43:52

编程思想:

(1).用假数据填充当前页面的listView
(2).用addFooterView方法,为listview加入一个ProgressBar用于显示数据异步加载
(3).重写onScroll方法,找出listview最后的位置
(4).重写onScrollStateChanged方法,处理数据.这里使用发消息给handler加载数据,是为了减少主线程负重,把数据的加载都运行在工作线程.

效果图:

这里写图片描述

代码实现:

private ListView listView;
    private View moreView; //加载更多页面

    private SimpleAdapter adapter;
    private ArrayList<HashMap<String, String>> listData;

    private int lastItem;
    private int count;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = (ListView)findViewById(R.id.listView);
        moreView = getLayoutInflater().inflate(R.layout.load, null);
        listData = new ArrayList<HashMap<String,String>>();

        prepareData(); //准备数据
        count = listData.size();

        adapter = new SimpleAdapter(this, listData,R.layout.item, 
                new String[]{"itemText"}, new int[]{R.id.itemText});

        listView.addFooterView(moreView); //添加底部view,一定要在setAdapter之前添加,否则会报错。

        listView.setAdapter(adapter); //设置adapter
        listView.setOnScrollListener(this); //设置listview的滚动事件
    }

    private void prepareData(){  //准备数据
        for(int i=0;i<10;i++){
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("itemText", "测试数据"+i);
            listData.add(map);
        }
    }

    private void loadMoreData(){ //加载更多数据
         count = adapter.getCount(); 
        for(int i=count;i<count+5;i++){
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("itemText", "测试数据"+i);
            listData.add(map);
        }
        count = listData.size();
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        //减1是因为上面加了个addFooterView
        lastItem = firstVisibleItem + visibleItemCount - 1;  

    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
        Log.i(TAG, "scrollState="+scrollState);
        //下拉到空闲是,且最后一个item的数等于数据的总数时,进行更新
        if(lastItem == count  && scrollState == this.SCROLL_STATE_IDLE){ 
            Log.i(TAG, "拉到最底部");
            moreView.setVisibility(view.VISIBLE);

            mHandler.sendEmptyMessage(0);

        }

    }
    //声明Handler
    private Handler mHandler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
            case 0:

                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                loadMoreData();  //加载更多数据,这里可以使用异步加载
                adapter.notifyDataSetChanged();
                moreView.setVisibility(View.GONE); 

                if(count > 30){
                    Toast.makeText(MainActivity.this, "木有更多数据!", 3000).show();
                    listView.removeFooterView(moreView); //移除底部视图
                }
                Log.i(TAG, "加载更多数据");
                break;

            }
        };
    };
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android Studio ListView数据的分批加载

  • 2016年11月15日 12:33
  • 5.63MB
  • 下载

一个简单的分批加载ListView的Demo

一个分批加载ListView的Demo

listview上拉加载下拉刷新demo

  • 2015年06月29日 17:05
  • 2.43MB
  • 下载

listView分批和分页加载数据

在Android应用程序中,有时候会向listView中加载很多数据,向listView中加载数据是一个耗时的过程,加载过多的数据用户停留在listView上,一直等待,给用户的体验特别不好,比如向服...

ListView中数据的分批及分页加载

需求: ListView有一万条数据,如何显示;如果将十万条数据加载到内存,很消耗内存 解决办法: 优化查询的数据:先获取几条数据显示到界面上 进行分批处理—优化了用户体验 进行分页处理—...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ListView上拉刷新,数据的分批加载小demo
举报原因:
原因补充:

(最多只允许输入30个字)