Android中ListView的分页加载数据方式

in 那美克星

Listview在应用到商城的商品列表或者类似微博的条目列表时需要加载大量数据,如果在界面启动时就加载全部数据的话肯定会加重手机负担,也会影响APP的加载速度,这时候就Listview分页加载的好处就体现出来。

新建一个测试项目,布局界面只有三个:activity_main.xml,footer_listview.xml,item.xml。

activity_main.xml为主界面,里面只有一个listview控件。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
    
    <ListView 
        android:id="@+id/list"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent">
    </ListView>

</RelativeLayout>

footer_listview.xml为listview底部视图,点击后加载数据。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <Button 
        android:id="@+id/load_more"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:text="Load More"/>

</LinearLayout>

item.xml为listview的item视图,里面只有一个textview。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView 
        android:id="@+id/tv"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:textSize="50sp"
        android:text="1111"/>
    
</LinearLayout>

写完布局文件后开始写listview的适配器,此处用来做演示,就先用ArrayAdapter填充数据,代码如下:

final ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1, initData());

private List<String> initData(){
        for(int i = 0;i < 10;i++){
            list.add("花墨世界 cnhuamo.net:"+i);
        }
        return list;
    }

然后在listview底部加上footer视图。

loadMoreView = getLayoutInflater().inflate(R.layout.footer_listview,null );
listview.addFooterView(loadMoreView);

之后要实现点击按钮后加载数据的功能。

button.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                int i = adapter.getCount(),j = adapter.getCount()+5;
                for(;i < j;i++){
                    list.add("花墨世界 cnhuamo.net:"+i);
                }
                adapter.notifyDataSetChanged();
            }
        });

最后要设置下listview滚动条的监听器,具体请看代码注释。

listview.setOnScrollListener(new OnScrollListener() {
            //当滑动到底部后自动加载,判断滑动条停止&&最后可视条目等于adapter的条目
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                if(scrollState == OnScrollListener.SCROLL_STATE_IDLE && lastIndex == adapter.getCount()){
                    //自动加载功能,加载数据可以写在此处
                }
            }
            
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                //计算最后可见条目索引
                lastIndex = firstVisibleItem + visibleItemCount -1;
                //所有条目和最大条目相等时移除底部View
                if(totalItemCount == maxNum +1){
                    listview.removeFooterView(loadMoreView);
                    Toast.makeText(MainActivity.this, "数据加载完成!", Toast.LENGTH_SHORT).show();
                }
            }
        });

运行结果:

Responses