android第三方框架 xlistview 的使用


如今上拉刷新,下拉加載更多已經是浩如煙海的app的標配了

最近正好有相關的需要就去學習了一下,還是那句老話凡事都靠自己來

搞實在不是一件好事,費時費力不說可能還是在做無用功,不過自己研究學習

還是很有必要的。不多說我用到的第三方框架叫xlistview這是它的托管地址:

https://github.com/Maxwin-z/XListView-Android

下載下來以后

把解壓出來的內容拷貝到自己的項目下(可以自己建一個包專門存放,我是這樣做的)

 

要注意的是layout,String和drawable下也有幾個對應的文件,這些也要考進去。

然后為listview寫布局

注意:<com.xxxxxxx你自己的對應文件的位置xxx>

<?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:background="#f0f0f0">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <com.example.guwie.yaoren.ui.view.XListView
        android:id="@+id/xListView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:cacheColorHint="#00000000">

    </com.example.guwie.yaoren.ui.view.XListView>


</LinearLayout>


為布局文件寫對應的java文件

public class TaskList extends AppCompatActivity implements XListView.IXListViewListener {

    //創建xlistview對象
    private XListView mListView;

    //創建數據
    List<ItemBean> dataList = new ArrayList<>();
    private Object item;

    int page = 1;
    int maxpage = 0;

    //用來執行耗時操作
    private Handler mHandler;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tasklist);

        //指定布局中的xlistview控件
        mListView = (XListView) findViewById(R.id.xListView);
        mListView.setPullLoadEnable(true);
        mListView.setPullRefreshEnable(true);

        getTaskList(page);
        mListView.setAdapter(new MyAdapter(TaskList.this, dataList));

        mListView.setXListViewListener(this);

        mHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what){
                    case 0x001:
                        Toast.makeText(TaskList.this , "已無更多數據" , Toast.LENGTH_SHORT).show();
                        break;
                    case 0x002:
                        Toast.makeText(TaskList.this , "未找到數據" , Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        };
    }


    //獲得數據后要執行onLoad()方法,否則刷新會一直進行停不下來

    private void onLoad() {

        mListView.stopRefresh();

        mListView.stopLoadMore();

        mListView.setRefreshTime("剛剛");

    }


    @Override
    public void onRefresh() {

        dataList.clear();
        page = 1;
        mHandler.post(new Runnable() {//執行耗時操作
            @Override
            public void run() {
                getTaskList(page);
                mListView.setAdapter(new MyAdapter(TaskList.this, dataList));
            }
        });
        onLoad();
        Log.i("------------------", "onRefresh");

    }

    @Override
    public void onLoadMore() {

        mHandler.post(new Runnable() {
            @Override
            public void run() {
                if(page < maxpage){

                    getTaskList(++page);
                    mListView.deferNotifyDataSetChanged();

                }else{

                    Message msg = new Message();
                    msg.what=0x001;
                    mHandler.sendMessage(msg);
                }
//                getTaskList(++page);
//                mListView.deferNotifyDataSetChanged();
                //mListView.setAdapter(new MyAdapter(TaskList.this, dataList));

            }
        });
        onLoad();
        Log.i("------------------", "onLoadMore");
    }

    /***
     *    獲取list數據 volley 方法 post string數據 得到 json數據 服務端由php編寫
     *  
     * */
    public void getTaskList(int pages) {

        Toast.makeText(TaskList.this , pages+"" , Toast.LENGTH_SHORT).show();
        RequestQueue mreuestQueut = Volley.newRequestQueue(this);

        final Gson gson = new Gson();

        JsonObjectRequest jsreq = new JsonObjectRequest(Request.Method.GET, TASK_LIST_DATE+"page="+pages, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject jsonObject) {

                        Message msg = new Message();

                        try {
                            int code = jsonObject.getInt("code");
                            if(code == 200){

                                int size = jsonObject.getJSONArray("data").length();
                                for(int i=0; i<size ; i++){

                                    JSONObject dataObject = jsonObject.getJSONArray("data").getJSONObject(i);
                                    String title = dataObject.getString("title");
                                    String price = dataObject.getString("fee");
                                    String explain = dataObject.getString("description");
                                    dataList.add(new ItemBean(title , explain , price , "3km"));
                                }
                                maxpage = ++page;
                                page = page-1;
                            }else if(code == 205){

                                //已無更多數據
                                //maxpage = page;
                                page = maxpage;
                                msg.what=0x001;
                                mHandler.sendMessage(msg);

                            }else if(code == 404){
                                //未找到數據
                                msg.what = 0x002;
                                mHandler.sendMessage(msg);
                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                            Log.i("----------------", "客戶端內部錯誤");
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        Log.i("----------------","服務器出錯"+volleyError.toString());

                    }
                });
        mreuestQueut.add(jsreq);
    }

}

這里的MyAdapter的方法是自定義的,詳情請參考慕課網的徐大神的《Android必學-BaseAdapter的使用與優化》

上面方法中有關於volley的用法請自行百度
運行效果: 上拉加載更多

學習之處參考的demo:http://www.thinksaas.cn/group/topic/348557/

感謝作者

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM