对于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加有列出,比较简单,此处省略,
希望此文章对朋友有所帮助,谢谢!