XListview

来源:互联网 发布:mysql错误1054 编辑:程序博客网 时间:2024/05/16 19:51

在介绍这个控件实现效果之前告诉大家学习技术是为了更好的发展帮助更多的人相见即是缘分,在岁月不断流淌过程中应该随主流一路浩浩荡荡一起流入大海有一个更好遨游的空间。


大致思路1、获取控件2、准备数据3、设置刷新和加载更多方法并设置监听

XML

main

<?xml version="1.0" encoding="utf-8"?><RelativeLayout    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="com.example.xlistview.MainActivity">    <com.example.xlistview.view.XListView        android:layout_width="match_parent"        android:layout_height="match_parent"        android:id="@+id/xlv"></com.example.xlistview.view.XListView></RelativeLayout>
String样式
<string name="xlistview_header_hint_normal">下拉刷新</string><string name="xlistview_header_hint_ready">松开刷新数据</string><string name="xlistview_header_hint_loading">正在加载...</string><string name="xlistview_header_last_time">上次更新时间:</string><string name="xlistview_footer_hint_normal">查看更多</string><string name="xlistview_footer_hint_ready">松开载入更多</string>

item条目
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="horizontal"    android:padding="10dp"    android:layout_width="match_parent"    android:layout_height="match_parent">    <ImageView        android:id="@+id/image_view"        android:layout_width="100dp"        android:layout_height="100dp" />    <TextView        android:id="@+id/text_title"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></LinearLayout>
头部布局xlistview_header.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="wrap_content" >    <RelativeLayout        android:id="@+id/xlistview_footer_content"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:padding="10dp" >        <ProgressBar            android:id="@+id/xlistview_footer_progressbar"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:visibility="invisible" />        <TextView            android:id="@+id/xlistview_footer_hint_textview"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:text="@string/xlistview_footer_hint_normal" />    </RelativeLayout></LinearLayout>
底部布局xlistview_footer.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="wrap_content"    android:gravity="bottom" >    <RelativeLayout        android:id="@+id/xlistview_header_content"        android:layout_width="fill_parent"        android:layout_height="60dp" >        <LinearLayout            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:gravity="center"            android:orientation="vertical" android:id="@+id/xlistview_header_text">            <TextView                android:id="@+id/xlistview_header_hint_textview"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="@string/xlistview_header_hint_normal" />            <LinearLayout                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginTop="3dp" >                <TextView                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:text="@string/xlistview_header_last_time"                    android:textSize="12sp" />                <TextView                    android:id="@+id/xlistview_header_time"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:textSize="12sp" />            </LinearLayout>        </LinearLayout>        <ImageView            android:id="@+id/xlistview_header_arrow"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_alignLeft="@id/xlistview_header_text"            android:layout_centerVertical="true"            android:layout_marginLeft="-35dp"            android:src="@drawable/xlistview_arrow" />        <ProgressBar            android:id="@+id/xlistview_header_progressbar"            android:layout_width="30dp"            android:layout_height="30dp"            android:layout_alignLeft="@id/xlistview_header_text"            android:layout_centerVertical="true"            android:layout_marginLeft="-40dp"            android:visibility="invisible" />    </RelativeLayout></LinearLayout>
代码
mian
package com.example.xlistview;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import com.example.xlistview.Bean.Result;import com.example.xlistview.Utils.MyTask;import com.example.xlistview.adapter.MyAdapter;import com.example.xlistview.view.XListView;import com.google.gson.Gson;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;public class MainActivity extends AppCompatActivity {    ArrayList<Result.DataBean> list = new ArrayList<>();    private XListView xlv;    private MyAdapter myAdapter;    private int pageindex = 1;    Handler myHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            if (msg.what == 1) {                //关闭底部视图                xlv.stopLoadMore();            } else {                Date date = new Date(System.currentTimeMillis());                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");                String format = simpleDateFormat.format(date);                //设置时间                xlv.setRefreshTime(format);                //关闭头部视图                xlv.stopRefresh();            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //1、获取控件        xlv = (XListView) findViewById(R.id.xlv);        //2、设置刷新和加载更多的方法并设置监听        //支持下拉刷新        xlv.setPullRefreshEnable(true);        //支持加载更多        xlv.setPullLoadEnable(true);        //设置监听事件        xlv.setXListViewListener(new XListView.IXListViewListener() {            @Override            public void onRefresh() {                pageindex = pageindex + 20;                //创建AsyncTask                MyTask myTask = new MyTask(new MyTask.Icallbacks() {                    @Override                    public void updataUiByjson(String jsonstr) {                        //创建Gson                        Gson gson = new Gson();                        //进行解析                        Result result = gson.fromJson(jsonstr, Result.class);                        //查找所需集合                        list.addAll(result.getData());                        //设置适配器                        setAdapter();                        //延迟关闭头部视图                        myHandler.sendEmptyMessageDelayed(2, 500);                    }                });                myTask.execute("http://api.expoon.com/AppNews/getNewsList/type/1/p/" + pageindex + "\n");            }            @Override            public void onLoadMore() {                pageindex = 0;                //创建AsyncTask                MyTask myTask = new MyTask(new MyTask.Icallbacks() {                    @Override                    public void updataUiByjson(String jsonstr) {                        //创建Gson                        Gson gson = new Gson();                        //进行解析                        Result result = gson.fromJson(jsonstr, Result.class);                        //查找所需集合                        list.addAll(result.getData());                        //设置适配器                        setAdapter();                        //延迟关闭头部视图                        myHandler.sendEmptyMessageDelayed(1, 500);                    }                });                myTask.execute("http://api.expoon.com/AppNews/getNewsList/type/1/p/" + pageindex + "\n");            }        });        //3、准备数据        InitData();    }    private void InitData() {        //创建AsyncTask        MyTask myTask = new MyTask(new MyTask.Icallbacks() {            @Override            public void updataUiByjson(String jsonstr) {                //创建Gson                Gson gson = new Gson();                //进行解析                Result result = gson.fromJson(jsonstr, Result.class);                //查找所需集合                list.addAll(result.getData());                //设置适配器                setAdapter();            }        });        myTask.execute("http://api.expoon.com/AppNews/getNewsList/type/1/p/1\n");    }    private void setAdapter() {            if (myAdapter == null) {                myAdapter = new MyAdapter(this, list);                xlv.setAdapter(myAdapter);            } else {                //通知适配器                myAdapter.notifyDataSetChanged();            }    }}

Utils
package com.example.xlistview.Utils;import android.content.Context;import android.graphics.Bitmap;import android.os.Environment;import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;import com.nostra13.universalimageloader.core.DisplayImageOptions;import com.nostra13.universalimageloader.core.ImageLoader;import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;import java.io.File;/** * Created by DELL on 2017/10/17. */public class ImageloaderUtil {    public static void initConfig(Context context) {        //配置//        File cacheFile=context.getExternalCacheDir();        File cacheFile= new File(Environment.getExternalStorageDirectory()+"/"+"image");        ImageLoaderConfiguration config=new ImageLoaderConfiguration.Builder(context)                .memoryCacheExtraOptions(480, 800)//缓存图片最大的长和宽                .threadPoolSize(2)//线程池的数量                .threadPriority(4)                .memoryCacheSize(2*1024*1024)//设置内存缓存区大小                .diskCacheSize(20*1024*1024)//设置sd卡缓存区大小                .diskCache(new UnlimitedDiscCache(cacheFile))//自定义缓存目录                .writeDebugLogs()//打印日志内容                .diskCacheFileNameGenerator(new Md5FileNameGenerator())//给缓存的文件名进行md5加密处理                .build();        ImageLoader.getInstance().init(config);    }    /**     * 获取图片设置类     * @return     */    public static DisplayImageOptions getImageOptions(){        DisplayImageOptions optionsoptions=new DisplayImageOptions.Builder()                .cacheInMemory(true)//使用内存缓存                .cacheOnDisk(true)//使用磁盘缓存                .bitmapConfig(Bitmap.Config.RGB_565)//设置图片格式                .displayer(new RoundedBitmapDisplayer(10))//设置圆角,参数代表弧度                .build();        return optionsoptions;    }}

package com.example.xlistview.Utils;import android.app.Application;/** * Created by DELL on 2017/10/20. */public class MyApplication extends Application {    @Override    public void onCreate() {        super.onCreate();        ImageloaderUtil.initConfig(this);    }}

package com.example.xlistview.Utils;import android.os.AsyncTask;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;/** * Created by DELL on 2017/10/17. */public class MyTask extends AsyncTask<String,Void,String> {    //申请一个接口类对象    private Icallbacks icallbacks;    //将无参构造设置成私有的,使之在外部不能够调用    private MyTask() {    }    //定义有参构造方法    public MyTask(Icallbacks icallbacks) {        this.icallbacks = icallbacks;    }    @Override    protected String doInBackground(String... params) {          String str="";        try {            //使用HttpUrlConnection            URL url = new URL(params[0]);            HttpURLConnection connection = (HttpURLConnection) url.openConnection();            connection.setConnectTimeout(5000);            connection.setReadTimeout(5000);            int code = connection.getResponseCode();            if(code==200){                InputStream stream = connection.getInputStream();                //调用工具类中的静态方法                str=StreamToString.streamTostr(stream,"utf-8");            }        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return str;    }    @Override    protected void onPostExecute(String s) {        super.onPostExecute(s);        //解析,封装到bean,更新UI组件        icallbacks.updataUiByjson(s);    }    //定义一个接口    public  interface Icallbacks{        //根据回传的json字符串,解析并更新页面组件            void updataUiByjson(String jsonstr);        }}

package com.example.xlistview.Utils;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;/** * Created by DELL on 2017/10/17. */public class StreamToString {    public static String streamTostr(InputStream inputStream, String chartSet){        StringBuilder builder = new StringBuilder();        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));        String con;        try {            while((con=reader.readLine())!=null){                StringBuilder append = builder.append(con);            }            return builder.toString();        } catch (IOException e) {            e.printStackTrace();        }        return "";    }}
适配器
package com.example.xlistview.adapter;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import com.example.xlistview.Bean.Result;import com.example.xlistview.R;import com.example.xlistview.Utils.ImageloaderUtil;import com.nostra13.universalimageloader.core.ImageLoader;import java.util.List;/** * @author Zhanghj * @date 2017/10/11 * @description: */public class MyAdapter extends BaseAdapter{    Context context;    private List<Result.DataBean> list  ;    public MyAdapter(Context context, List<Result.DataBean> list) {        this.context = context;        this.list = list;    }    @Override    public int getCount() {        return list.size();    }    /**     * 获取当前条目展示的内容     * @param i     * @return     */    @Override    public Object getItem(int i) {        return list.get(i);    }    /**     * 获取当前条目的id,,,,只要唯一就可以     * @param i     * @return     */    @Override    public long getItemId(int i) {        return i;    }    @Override    public View getView(int i, View view, ViewGroup viewGroup) {        ViewHolder holder;        if (view == null){            //创建ViewHolder            holder = new ViewHolder();            //获取布局            view = View.inflate(context, R.layout.item_layout,null);            //获取控件            holder.textView = (TextView)view.findViewById(R.id.text_title);            holder.imageView = (ImageView) view.findViewById(R.id.image_view);            //设置tag            view.setTag(holder);        }else {            //获得tag            holder = (ViewHolder) view.getTag();        }        //赋值值        holder.textView.setText(list.get(i).getNews_title());        ImageLoader.getInstance().displayImage(list.get(i).getPic_url(),holder.imageView, ImageloaderUtil.getImageOptions());        return view;    }    private class ViewHolder{        ImageView imageView;        TextView textView;    }}