ListView 分段加载更新实例

ListView是android中最常用的控件之一。


在实际运用中往往会遇到一次性加载全部数据过多,需要分页加载增加程序运行效率
本demo是将更新的监听放在listview的foot中,通过底部按钮点击触发或者通过滑动事件监听,当滑动到列表最底部的时候触发

有图有真像:

列表初始状态

触发加载

加载后

部分代码:

MainActivity

    private void initActivity() {
        // TODO Auto-generated method stub
        loadMoreView = getLayoutInflater().inflate(R.layout.loadmore, null);
        loadmore_btn = (Button) loadMoreView.findViewById(R.id.loadmore_btn);
        loadmore_btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                doUpdate();
            }
        });
        listView = (ListView) findViewById(R.id.listView);
        listView.addFooterView(loadMoreView);
        initAdapter();
        listView.setAdapter(adapter);
        listView.setOnScrollListener(new OnScrollListener() {

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                // TODO Auto-generated method stub
                int itemsLastIndex = adapter.getCount() - 1;
                int lastIndex = itemsLastIndex + 1;
                if (scrollState == OnScrollListener.SCROLL_STATE_IDLE
                        && visibleLast == lastIndex) {
                    // 可在这添加滑到列表底的时候异步自动加载
                    // doUpdate();
                }
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                // TODO Auto-generated method stub
                visibleCount = visibleItemCount;
                visibleLast = firstVisibleItem + visibleItemCount - 1;
            }
        });
    }

    protected void doUpdate() {
        // TODO Auto-generated method stub
        loadmore_btn.setText("loading ...");
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                loadData();
                adapter.notifyDataSetChanged();// 通知adapter数据变化
                listView.setSelection(visibleLast - visibleCount + 1);
                loadmore_btn.setText("Load More");
            }
        }, 2000);
    }

    private void loadData() {
        // TODO Auto-generated method stub
        int count = adapter.getCount();
        for (int i = count; i < count + 10; i++) {
            adapter.addItem(String.valueOf(i + 1));
        }
    }

    private void initAdapter() {
        // TODO Auto-generated method stub
        List<String> items = new ArrayList<String>();
        for (int i = 0; i < 10; i++) {
            items.add(String.valueOf(i + 1));
        }
        adapter = new ListAdapter(this, items);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }


ListAdapter

    public ListAdapter(Context context, List<String> items) {
        this.items = items;
        this.inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return items.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_item, null);
        }
        TextView textView = (TextView) convertView
                .findViewById(R.id.list_item_text);
        textView.setText(items.get(position));
        return convertView;
    }

    /**
     * 添加列表项
     * @param item
     */
    public void addItem(String item){
        items.add(item);
    }

提醒一下:要下载android-support-v4.jar  这个第三方的jar包哦! 这里就不提供下载了!

 源码下载:LoadMore.rar

posted on 2012-11-15 15:36  nuliniao  阅读(1975)  评论(0编辑  收藏  举报