首页 > 移动开发 > ListView分页加载数据

ListView分页加载数据

对于ListView分页加载数据,是正常情况下是非常有必要。一般对于少量的数据一次性把全部数据加载到ListView中显示,对于数据量多比较大,特别在资源有限的手机设备中更有重要,由用户去点击加载想要数据更为合适。在一些博客上看到关于ListView分页加载,但不太全面,实用性不高,因此我模拟正常情况下ListView分页加载,对于有方面帮助的朋友肯定有用,由于本人技术有限,可能存在些问题,欢迎指正,谢谢!

1.  先看效果吧,

    

  
2. java代码:MainActivity.java

/**
 * ListView分页加载数据
 * @author zhangkai281
 *
 */
public class MainActivity extends Activity {
    private ListView listView;
    private List<Map<String,Object>> data;
    private listViewAdapter adapter;
    //分页加载的数据的数量
    private int pageSize=10;
    private final int pageType=1;
    //查看更多
    private TextView moreTextView;
    //正在加载进度条
    private LinearLayout loadProgressBar;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_page);
        
        listView=(ListView)findViewById(R.id.lv_id);
        
        //第一个参数:1起始数  第二个参数:显示的数目
        data=InitValue.initValue(1,15);
        
        //在ListView中添加"加载更多"
        addPageMore();
        //添加"加载更多"一定要在设置Adapter之前
        adapter=new listViewAdapter();
        listView.setAdapter(adapter);
    }
    
    private class listViewAdapter extends BaseAdapter{
        int count=data.size();
        @Override
        public int getCount() {
            return count;
        }

        @Override
        public Object getItem(int position) {
            return position;
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view=LayoutInflater.from(MainActivity.this).inflate(R.layout.list_page_item, null);
            TextView title=(TextView)view.findViewById(R.id.tv_id);
            TextView text=(TextView)view.findViewById(R.id.title_id);
            title.setText(data.get(position).get("title").toString());
            text.setText(data.get(position).get("text").toString());
            return view;
        }
        
    }
    
    /**
     * 加载下一页的数据
     * @param pageStart
     * @param pageSize
     */
    private void chageListView(int pageStart,int pageSize){
        List<Map<String,Object>> data=InitValue.initValue(pageStart,pageSize);
        for (Map<String, Object> map : data) {
            this.data.add(map);
        }
        data=null;
    }
    
    /**
     * 在ListView中添加"加载更多"
     */
    private void addPageMore(){
        View view=LayoutInflater.from(this).inflate(R.layout.list_page_load, null);
        moreTextView=(TextView)view.findViewById(R.id.more_id);
        loadProgressBar=(LinearLayout)view.findViewById(R.id.load_id);
        moreTextView.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                //隐藏"加载更多"
                moreTextView.setVisibility(View.GONE);
                //显示进度条
                loadProgressBar.setVisibility(View.VISIBLE);
                
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //休眠3秒,用于模拟网络操作时间
                        try {
                            Thread.sleep(3000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        
                        //加载模拟数据:下一页数据, 在正常情况下,上面的休眠是不需要,直接使用下面这句代码加载相关数据
                        chageListView(data.size(),pageSize);
                        
                        Message mes=handler.obtainMessage(pageType);
                        handler.sendMessage(mes);
                    }
                }).start();
            }
        });
        listView.addFooterView(view);
    }
    
    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case pageType:
                //改变适配器的数目
                adapter.count += pageSize;
                //通知适配器,发现改变操作
                adapter.notifyDataSetChanged();
                
                //再次显示"加载更多"
                moreTextView.setVisibility(View.VISIBLE);
                //再次隐藏“进度条”
                loadProgressBar.setVisibility(View.GONE);
                break;

            default:
                break;
            }
            
            super.handleMessage(msg);
        }
    };
}

3.  模拟数据,通常是通过网络取得服务器的数据,显示出来,得向服务传递参数包括分页相关,当时启起行数,每页显示多行数据。也可以加载本地的SQLite库中的数据。加载网络的比较比吧,以下只是模拟数据:

public class InitValue {
    public static int page=1;
    
    /**
     * 模拟数据分页加载,
     * @param pageStart  起始数
     * @param pageSize   每页显示数目
     * @return
     */
    public static List<Map<String,Object>> initValue(int pageStart,int pageSize){
        Map<String,Object> map;
        List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
        for(int i=0;i<pageSize;i++){
            map=new HashMap<String,Object>();
            map.put("text", "zhangkai281发表文章");
            map.put("title", page+"_ListView分页显示");
            ++page;
            list.add(map);
        }
        return list;
    }
}

4. 布局文件:main.xml:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_height="wrap_content" android:scrollbars="vertical">
    <LinearLayout  android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="fill_parent">
            <TextView android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:text="@string/app_name" />
            <ViewFlipper android:id="@+id/vf_id" android:layout_width="fill_parent"
                android:layout_height="wrap_content" />
    </LinearLayout>
</ScrollView>

5. 布局文件:list_page.xml:

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

6. 布局文件:list_page_load.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical" android:gravity="center_horizontal"
    android:paddingTop="13dp" android:paddingBottom="13dp">
    <TextView android:id="@+id/more_id" android:layout_width="fill_parent" 
        android:layout_height="wrap_content" android:text="查看更多..."
        android:textSize="25dp" android:gravity="center_horizontal"/>
    <LinearLayout android:id="@+id/load_id" android:orientation="horizontal"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:visibility="gone">
        <ProgressBar android:layout_width="match_parent" android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal" />
        <TextView android:layout_width="wrap_content" android:layout_height="fill_parent"
            android:gravity="center_vertical" android:layout_marginLeft="10dp"
            android:text="正在加载..." android:textSize="20dp"/>
    </LinearLayout>
</LinearLayout>

7. 还有此小xml加有列出,比较简单,此处省略,

希望此文章对朋友有所帮助,谢谢!


本文固定链接: http://www.devba.com/index.php/archives/1916.html | 开发吧

ListView分页加载数据:等您坐沙发呢!

发表评论


亲,不支持纯字母、符号评论哦~