关闭

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

标签: listview线程编程
147人阅读 评论(0) 收藏 举报
分类:

编程思想:

(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;

            }
        };
    };
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1024次
    • 积分:63
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档