listview分頁加載

 

ListView分頁加載數據

2011-07-29 11:46:15cnblogs.com-zhangkai281 - 點擊數: 599

對於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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章