1. 程式人生 > >用XListView實現向上重新整理,向下追加資料,並且多條目載入

用XListView實現向上重新整理,向下追加資料,並且多條目載入

開始佈局

此處只展示Xlistview的佈局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.MainActivity">


<com.example.mylibrary.me.maxwin.view.XListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/xlv"

    ></com.example.mylibrary.me.maxwin.view.XListView>

</android.support.constraint.ConstraintLayout>

開始java程式碼

MainActivity

package com.example.day9_xlistview.ui;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

import com.example.day9_xlistview.R;
import com.example.day9_xlistview.adpater.MAdapter;
import com.example.day9_xlistview.bean.Caipu;
import com.example.mylibrary.me.maxwin.view.XListView;
import com.google.gson.Gson;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private XListView xlv;
    private int page=0;
    private MAdapter ma;
  private ArrayList<Caipu.ResultBean.DataBean> list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //查詢資源id
        xlv=findViewById(R.id.xlv);
        list=new ArrayList<Caipu.ResultBean.DataBean>();
        //新增介面卡
        ma=new MAdapter(MainActivity.this,list);
        xlv.setAdapter(ma);
        //是否開啟下拉重新整理 上拉載入
        xlv.setPullLoadEnable(true);
       //設定監聽
        xlv.setXListViewListener(new XListView.IXListViewListener() {
            @Override
            public void onRefresh() {
                //重新整理資料(此處介面頁面是從0開始)
                page=0;
                loadData(page);
            }
            //載入更多
            @Override
            public void onLoadMore() {
                loadData(page);
            }
        });
        //一進來就去載入第一頁資料
        loadData(page);//page初始值為0
    }

    private void loadData(int page) {
       final String path="http://apis.juhe.cn/cook/query?key=3ec004200a6a2f4cf4774e480c006375&menu=%E8%A5%BF%E7%BA%A2%E6%9F%BF&rn=10&pn=";
       String UrlWithPagenum=path+page;
       //載入網路資料
        new AsyncTask<String,String,List<Caipu.ResultBean.DataBean>>(){
            @Override
            protected List<Caipu.ResultBean.DataBean> doInBackground(String... strings) {
                Caipu caipu=null;
                try {
                    URL url=new URL(strings[0]);
                    try {
                        HttpURLConnection urlConnection= (HttpURLConnection) url.openConnection();
                        urlConnection.setRequestMethod("GET");
                        urlConnection.setConnectTimeout(5000);
                        urlConnection.setReadTimeout(5000);
                        int responseCode=urlConnection.getResponseCode();
                        //請求成功
                        if(responseCode==200){
                            String textString=StreantoString(urlConnection.getInputStream());
                            urlConnection.disconnect();
                            Gson gson=new Gson();
                           caipu=gson.fromJson(textString,Caipu.class);


                        }

                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
                //把資料返回
                return caipu == null ? null : caipu.getResult().getData();

            }
            //更新ui
            @Override
            protected void onPostExecute(List<Caipu.ResultBean.DataBean> dataBeans) {
                super.onPostExecute(dataBeans);
                //判斷是否取得資料
                if(dataBeans==null){
                    Toast.makeText(MainActivity.this, "請求資料錯誤", Toast.LENGTH_LONG).show();
                    return;
                }
                //如果有資料,則更新資料
               updateData(dataBeans);
               //載入重新整理完成
                loadCompleted();
            }

        }.execute(UrlWithPagenum);

    }

    private void updateData(List<Caipu.ResultBean.DataBean> dataBeans) {
        if(page==0){
            ma.setDatas(dataBeans);
            //設定更新時間
            Date date=new Date();
            xlv.setRefreshTime( date.toLocaleString());
        } else {
            ma.addDatas(dataBeans);
        }
    }

    //通過 載入 / 重新整理 完成
    private void loadCompleted() {
        //通過ListView:重新整理、載入完成
        //資料更新完成,頁面++
        page++;
        //完成則停止
        xlv.stopLoadMore();
        xlv.stopRefresh();
    }

    private String StreantoString(InputStream inputStream) throws IOException {

        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder stringBuilder=new StringBuilder();
        String str=null;
        while ((str=bufferedReader.readLine())!=null){
            stringBuilder.append(str);

        }
        bufferedReader.close();
        return stringBuilder.toString();
    }
}

Adapter

package com.example.day9_xlistview.adpater;

import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.day9_xlistview.R;
import com.example.day9_xlistview.bean.Caipu;
import com.example.day9_xlistview.configs.ImageLoaderconfigs;
import com.example.day9_xlistview.ui.MainActivity;
import com.nostra13.universalimageloader.core.ImageLoader;

import java.util.ArrayList;
import java.util.List;

public class MAdapter extends BaseAdapter{

    private MainActivity mainActivity;
    private ArrayList<Caipu.ResultBean.DataBean> list;

    public MAdapter(MainActivity mainActivity, ArrayList<Caipu.ResultBean.DataBean> list) {
        this.mainActivity = mainActivity;
        this.list = list;
    }

    @Override
    public int getItemViewType(int position) {
        if(position%2==0){
            return super.getItemViewType(position);
        } else{
            return 1;
        }

    }

    @Override
    public int getViewTypeCount() {
        return super.getViewTypeCount()+1;
    }

    /**
     * 更新資料
     */
    public void setDatas(List<Caipu.ResultBean.DataBean> datas) {
        //先清空所有資料
        list.clear();
        if (datas != null) {
           list.addAll(datas);
            notifyDataSetChanged();
        }

    }
    /**
     * 追加資料
     */
    public void addDatas(List<Caipu.ResultBean.DataBean> datas) {
        if (datas != null) {
            list.addAll(datas);
            notifyDataSetChanged();
        }
    }
    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder vh=null;
        if(convertView==null){
            convertView=View.inflate(mainActivity,getItemViewType(position)==0?R.layout.lv_item:R.layout.lv_item2,null);
            vh=new ViewHolder(convertView);
        } else {
            vh= (ViewHolder) convertView.getTag();
        }
        Caipu.ResultBean.DataBean data= (Caipu.ResultBean.DataBean) getItem(position);
        vh.bindData(data,position);

        return convertView;
    }
    class ViewHolder {
        TextView id;
        TextView title;
        ImageView iv;

        public ViewHolder(View viewItem) {
            id=viewItem.findViewById(R.id.id);
            title=viewItem.findViewById(R.id.title);
            iv=viewItem.findViewById(R.id.iv);
            viewItem.setTag(this);
        }

        public void bindData(Caipu.ResultBean.DataBean data,int position) {
            id.setText(data.getId());
            title.setText(data.getTitle());
            //下標為偶數時才展示圖片
            if(getItemViewType(position)==0){
                ImageLoader.getInstance().displayImage(data.getAlbums().get(0),iv, ImageLoaderconfigs.getops(mainActivity));

            }

        }
    }
}

新增許可權

<uses-permission android:name="android.permission.INTERNET"></uses-permission>