XListView上拉刷新数据及加载更多

本文介绍了一种使用XListView实现上下拉刷新与加载更多功能的方法,并通过实例展示了如何结合AsyncTask进行网络数据请求,以及如何配置图片缓存,最后实现了自定义的BaseAdapter来展示不同类型的列表项。
XListview灵活应用
主页面-----Activiety:
寻找控件,
设置XlistView上下拉及刷新时间,
设置图片缓存路径,
进入AsyncTask异步网络请求数据
import android.content.Context;
import android.os.Environment;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;


import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;

import view.XListView;


public class MainActivity extends AppCompatActivity {//主页面
    XListView lv;
    private String path="http://www.yulin520.com/a2a/impressApi/news/mergeList?pageSize=";
    private String path2="&page=";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        String path = Environment.getExternalStorageDirectory().getPath();
//        initImageLoader(this,new File(path+"/AssN"));
        init();//调用方法

    }

    public static void initImageLoader(Context c,File file) {
        // This configuration tuning is custom. You can tune every option, you may tune some of them,
        // or you can create default configuration by
        //  ImageLoaderConfiguration.createDefault(this);
        // method.
        ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(c);
        config.threadPriority(Thread.NORM_PRIORITY - 2);
        config.denyCacheImageMultipleSizesInMemory();
        config.diskCacheFileNameGenerator(new Md5FileNameGenerator());
        config.diskCacheSize(50 * 1024 * 1024); // 50 MiB
        config.tasksProcessingOrder(QueueProcessingType.LIFO);
        config.writeDebugLogs(); // Remove for release app
        config .diskCache(new UnlimitedDiscCache(file));//UnlimitedDiskCache 限制这个图片的缓存路径
        config .diskCacheFileCount(50);//配置sdcard缓存文件的数量
        // Initialize ImageLoader with configuration.
        ImageLoader.getInstance().init(config.build());
    }

    private void init() {
        lv = (XListView)findViewById(R.id.lv);

        lv.setPullLoadEnable(true);
        lv.setPullRefreshEnable(true);
        long l = System.currentTimeMillis();
        SimpleDateFormat formatter= new SimpleDateFormat("   yyyy年MM月dd日      HH时mm分ss秒");//设置时间

        String format = formatter.format(l);
        lv.setRefreshTime(format);
        MyTask myTask = new MyTask(lv, path, this, "GET",path2);//进入一部

        myTask.execute();

    }
}
AsyncTask页面:
网络请求数据,
设置xlistview的adapter,
设置xlistview上拉下滑刷新

import android.content.Context;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ListView;


import com.google.gson.Gson;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;


import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.List;

import java.util.logging.LogRecord;

import view.XListView;



public class MyTask extends AsyncTask<String,String,String> {//异步类

    private XListView lv;
    private String path;
    private Context context;
    private String gb;
    private List<Dates> data;
    private MyAdapter myAdapter;
    private String path2;
    private static  int  PAGE=1;
    private static  int  COUTN=10;
    private Handler han=new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if((boolean)msg.obj){
                if(msg.arg1==1){
                    long l = System.currentTimeMillis();
                    SimpleDateFormat formatter= new SimpleDateFormat("   yyyy年MM月dd日      HH时mm分ss秒");//设置时间
                    String format = formatter.format(l);
                    lv.setRefreshTime(format);
                    Log.d("zzz",data.toString());
                    myAdapter.setData(data);
                    myAdapter.notifyDataSetChanged();
                    lv.stopRefresh();
                }else if(msg.arg1==2){
                    Log.d("zzz",path+COUTN+path2+PAGE);

                    myAdapter.setData(data);
                    myAdapter.notifyDataSetInvalidated();
                    lv.stopLoadMore();
                }


            }
            super.handleMessage(msg);
        }
    };

    public MyTask(XListView lv, String path, Context context,String gb,String path2){
        this.lv=lv;
        this.path=path;
        this.context=context;
        this.gb=gb;
        this.path2=path2;
    }



    @Override
    protected String doInBackground(String... params) {



        getdata();//获取数据


        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        lv.setXListViewListener(new  XListView.IXListViewListener() {
            @Override
            public void onRefresh() {
                COUTN=10;
                PAGE=1;
                new Thread(){
                    @Override
                    public void run() {

                        boolean b = getdata();
                        Message message = new Message();
                        message.obj=b;
                        message.arg1=1;
                        han.sendMessage(message);
                        super.run();
                    }
                }.start();



            }

            @Override
            public void onLoadMore() {

                COUTN+=10;

                new Thread(){
                    @Override
                    public void run() {
                        boolean b = getdata();
                        Message message = new Message();
                        message.obj=b;
                        message.arg1=2;
                        han.sendMessage(message);
                        super.run();
                    }
                }.start();



            }
        });
         myAdapter = new MyAdapter(context, data);
        lv.setAdapter(myAdapter);//设置适配器

        super.onPostExecute(s);
    }

    public boolean getdata() {

        try {


            URL url = new URL(path+COUTN+path2+PAGE);


            HttpURLConnection cton = (HttpURLConnection) url.openConnection();
            cton.setRequestMethod(gb);
            cton.setReadTimeout(10000);
            cton.setConnectTimeout(10000);


            if(cton.getResponseCode()==200){
                InputStream inputStream = cton.getInputStream();
                String json = getjson(inputStream, "utf-8");
                Log.d("zzz","rencai");
                Gson gson = new Gson();
                Seec seec = gson.fromJson(json, Seec.class);
                data = seec.getData();


                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.d("zzz",e.toString());
        }

        return  false;


    }

    private String getjson(InputStream inputStream, String s) {
        String a="";
        String s1;
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, s));
            while ((s1=reader.readLine())!=null){
                a=a+s1;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return a;
    }
}


BaseAdapter:
多条目展示:

import android.support.v7.app.ActionBar;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;

import java.util.List;

/**
 * Created by Ning.A.C on 2017/9/11.
 */

public class MyAdapter extends BaseAdapter{//适配器
    private Context context;
    private List<Dates> data;

    public List<Dates> getData() {
        return data;
    }

    public void setData(List<Dates> data) {
        this.data = data;
    }

    public MyAdapter(Context context, List<Dates> data){//构造
        this.context=context;
        this.data=data;
    }

    @Override
    public int getCount() {

        return data.size();//写入长度
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    @Override
    public int getViewTypeCount() {
        return 2;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {//返回视图

        Con1 con1=null;
        Con2 con2=null;
        if(convertView==null){

            switch (getItemViewType(position)){
                case 0:
                    convertView = View.inflate(context, R.layout.item1, null);
                    con1=new Con1();
                    con1.tit1 = (TextView) convertView.findViewById(R.id.tit1);
                    con1.time1 = (TextView) convertView.findViewById(R.id.time1);
                    con1.img1=(ImageView)convertView.findViewById(R.id.img1);
                    convertView.setTag(con1);
                    break;
                case 1:
                    convertView = View.inflate(context, R.layout.layout, null);
                    con2=new Con2();
                    con2.tit2 = (TextView) convertView.findViewById(R.id.tit2);
                    con2.time2 = (TextView) convertView.findViewById(R.id.time2);

                    convertView.setTag(con2);
                    break;
            }





        }


        switch (getItemViewType(position)){
            case 0:
                con1= (Con1) convertView.getTag();
                con1.time1.setText(data.get(position).getTopTime());
                con1.tit1.setText(data.get(position).getTitle());

                DisplayImageOptions build = new DisplayImageOptions.Builder().showImageOnFail(R.mipmap.ic_launcher).showImageOnLoading(R.mipmap.ic_launcher).cacheOnDisk(true).cacheInMemory(true).build();
                ImageLoaderConfiguration build1 = new ImageLoaderConfiguration.Builder(context).defaultDisplayImageOptions(build).build();
                ImageLoader.getInstance().init(build1);
                ImageLoader.getInstance().displayImage(data.get(position).getImg(),con1.img1);
                break;
            case 1:
                con2= (Con2) convertView.getTag();
                con2.time2.setText(data.get(position).getTopTime());
                con2.tit2.setText(data.get(position).getTitle());


                break;
        }




        return convertView;
    }



    class Con1{
    TextView tit1,time1;
    ImageView img1;
}
class Con2{
    TextView tit2,time2;
}

}

Layout布局,主页面:





//XListView头尾视图需个人配置

xlistview_header:头配置


 <RelativeLayout
        android:id="@+id/xlistview_header_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:src="@mipmap/ic_launcher"
            android:id="@+id/xlistview_header_arrow"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:layout_marginLeft="50dp" />

        <ProgressBar
            android:id="@+id/xlistview_header_progressbar"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:layout_marginLeft="50dp" />

        <TextView
            android:id="@+id/xlistview_header_hint_textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_toRightOf="@+id/xlistview_header_arrow" />

        <TextView
            android:id="@+id/te"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/xlistview_header_arrow"
            android:layout_centerHorizontal="true"
            android:text="上次刷新时间:"
            android:layout_marginTop="10dp"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/te"
            android:layout_below="@+id/xlistview_header_arrow"
            android:layout_marginTop="10dp"
            android:id="@+id/xlistview_header_time"
            />

    </RelativeLayout>


xlistview_footer:脚布局:




 <RelativeLayout
        android:id="@+id/xlistview_footer_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:id="@+id/xlistview_footer_progressbar"
            />
        <TextView
            android:id="@+id/xlistview_footer_hint_textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"/>

    </RelativeLayout>








                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值