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(); } }}Utilspackage 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; }}
阅读全文
0 0
- XListView
- XListView
- Xlistview
- XListView
- xListView
- XListView
- xlistview
- xListView
- XlistView
- xlistview
- xlistview
- XListView
- xlistview
- xListview
- XListView
- XListView
- xlistview
- xlistview
- openwrt增加密码及ssh的方法
- LeetCode 657 Judge Route Circle 判断路线圈
- Matlab isfield
- 综合模拟1
- 自定义view--阶梯式
- XListview
- MVP+RxJava+Retrofit
- 百度页面
- 最长上升子序列
- 对数和指数
- 对分布式事务的一些理解
- 求教
- 快速排序
- Frangment和RadioGroup框架布局