ListView分頁加載數據
對於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加有列出,比較簡單,此處省略,
希望此文章對朋友有所幫助,謝謝!