listview分页加载

来源:互联网 发布:新网怎么解析域名 编辑:程序博客网 时间:2024/05/31 13:16
 

ListView分页加载数据

2011-07-29 11:46:15cnblogs.com-zhangkai281 -点击数: 599
分享到:QQ空间 新浪微博 腾讯微博 人人网

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

原创文章,转载请注明出处!谢谢!http://www.cnblogs.com/zhangkai281/

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.th7.cn/Program/Android/2011/07/29/35965.shtml

原创粉丝点击