布局:
1.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.handmark.pulltorefresh.library.PullToRefreshListView
xmlns:ptr="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/refresh_list_view"
ptr:ptrDrawable="@drawable/default_ptr_flip"
ptr:ptrAnimationStyle="flip"
ptr:ptrHeaderBackground="#383838"
ptr:ptrHeaderTextColor="#FFFFFF" >
</com.handmark.pulltorefresh.library.PullToRefreshListView>
</RelativeLayout>
2.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:padding="10dp">
<ImageView
android:id="@+id/image_view"
android:layout_width="100dp"
android:layout_height="100dp" />
<TextView
android:id="@+id/text_01"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp" />
</LinearLayout>
代码:
package com.example.a17_rikao_test;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;
import com.google.gson.Gson;
import com.handmark.pulltorefresh.library.ILoadingLayout;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 1.请求数据?httpUrlConnection+AsyncTask
* 2.解析数据..... 数据返回给onPostExcute()....添加到集合
* 3.设置适配器的显示
* 4.上拉下拉的功能pullToRefreshListView
*
*/
public class MainActivity extends AppCompatActivity {
private PullToRefreshListView refreshListView;
private int page_num = 1;//下拉刷新的页数
//记录当前页面所有的数据....上拉或下拉添加到集合
private List<DataDataBean.NewslistBean> list = new ArrayList<>();
private NewsAdapter newsAdapter;
private ILoadingLayout startLabels;
private ILoadingLayout endLabels;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
refreshListView = (PullToRefreshListView) findViewById(R.id.refresh_list_view);
getData();
//设置refreshListView
//1.设置刷新的模式
refreshListView.setMode(PullToRefreshBase.Mode.BOTH);
//2.设置刷新显示的文字
startLabels = refreshListView.getLoadingLayoutProxy(true, false);
startLabels.setPullLabel("下拉刷新");
startLabels.setRefreshingLabel("正在刷新...");
startLabels.setReleaseLabel("放开刷新");
endLabels = refreshListView.getLoadingLayoutProxy(false, true);
endLabels.setPullLabel("上拉刷新");
endLabels.setRefreshingLabel("正在载入...");
endLabels.setReleaseLabel("放开刷新...");
//3.设置监听事件
refreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
//下拉刷新
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
page_num++;
//再次请求数据
getRefreshData();
}
//上拉加载...不停的请求page=1的数据
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
//获取重复数据
getData();
}
});
}
/**
* 下拉刷新获取数据
* 1.pagenum是改变
* 2.每次添加到集合的前边
*/
private void getRefreshData() {
//1.创建异步任务的对象..第一个参数url路径Void,第二个参数表示进度Void,第三个参数返回值类型String(可以为空)
AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() {
//执行耗时的网络操作
@Override
protected String doInBackground(Void... voids) {
String path = "https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10&page="+page_num;
//1.url
try {
URL url = new URL(path);
//2.打开
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//设置
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
//获取
int responseCode = connection.getResponseCode();
if (responseCode == 200){
InputStream inputStream = connection.getInputStream();
//字节流转为字符串
String json = streamToString(inputStream, "utf-8");
return json;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//主线程,,,解析返回的数据
@Override
protected void onPostExecute(String json) {
//解析
Gson gson = new Gson();
DataDataBean dataDataBean = gson.fromJson(json, DataDataBean.class);
//dataDataBean.getNewslist();
//把解析的数据添加到集合中
list.addAll(0,dataDataBean.getNewslist());
setAdapter();
//刷新停止
refreshListView.onRefreshComplete();
//设置本次刷新的时间
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
startLabels.setLastUpdatedLabel("上次刷新时间:"+simpleDateFormat.format(date));
}
};
//2.执行任务
asyncTask.execute();
}
/**
* 获取网络数据
*/
private void getData() {
//1.创建异步任务的对象..第一个参数url路径Void,第二个参数表示进度Void,第三个参数返回值类型String(可以为空)
AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() {
//执行耗时的网络操作
@Override
protected String doInBackground(Void... voids) {
String path = "https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10&page=1";
//1.url
try {
URL url = new URL(path);
//2.打开
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//设置
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
//获取
int responseCode = connection.getResponseCode();
if (responseCode == 200){
InputStream inputStream = connection.getInputStream();
//字节流转为字符串
String json = streamToString(inputStream, "utf-8");
return json;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//主线程,,,解析返回的数据
@Override
protected void onPostExecute(String json) {
//解析
Gson gson = new Gson();
DataDataBean dataDataBean = gson.fromJson(json, DataDataBean.class);
//dataDataBean.getNewslist();
//把解析的数据添加到集合中
list.addAll(dataDataBean.getNewslist());
setAdapter();
//刷新停止
refreshListView.onRefreshComplete();
}
};
//2.执行任务
asyncTask.execute();
}
/**
* 设置适配器
*/
private void setAdapter() {
if (newsAdapter == null){
newsAdapter = new NewsAdapter(MainActivity.this, list);
refreshListView.setAdapter(newsAdapter);
}else {
newsAdapter.notifyDataSetChanged();
}
}
private String streamToString(InputStream inputStream,String charset) {
try {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream,charset);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String s = null;
StringBuilder builder = new StringBuilder();
while ((s = bufferedReader.readLine()) != null){
builder.append(s);
}
bufferedReader.close();
return builder.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
适配器:
package com.example.a17_rikao_test;
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.nostra13.universalimageloader.core.ImageLoader;
import java.util.List;
/**
* @author Dash
* @date 2017/9/16
* @description:
*/
public class NewsAdapter extends BaseAdapter {
Context context;
List<DataDataBean.NewslistBean> list;
public NewsAdapter(Context context, List<DataDataBean.NewslistBean> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder;
if (view == null){
view = View.inflate(context,R.layout.item_layout,null);
holder = new ViewHolder();
holder.imageView = view.findViewById(R.id.image_view);
holder.textView = view.findViewById(R.id.text_01);
view.setTag(holder);
}else {
holder = (ViewHolder) view.getTag();
}
holder.textView.setText(list.get(i).getTitle());
//图片显示
ImageLoader.getInstance().displayImage(list.get(i).getPicUrl(),holder.imageView,ImageLoaderUtil.getDefaultOption());
return view;
}
private class ViewHolder{
ImageView imageView;
TextView textView;
}
}
ImageLoader自定义:
package com.example.a17_rikao_test;
import android.app.Application;
/**
* @author Dash
* @date 2017/9/16
* @description:
*/
public class BaseApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//配置imageLoader
ImageLoaderUtil.init(this);
}
}
ImageLoader工具类:
package com.example.a17_rikao_test;
import android.content.Context;
import android.graphics.Bitmap;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.decode.BaseImageDecoder;
import com.nostra13.universalimageloader.core.display.CircleBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.utils.StorageUtils;
import java.io.File;
/**
* @author Dash
* @date 2017/9/15
* @description:
*/
public class ImageLoaderUtil {
/**
* 初始化imageLoader
* @param context
*/
public static void init(Context context) {
//1.获取配置config对象
File cacheDir = StorageUtils.getCacheDirectory(context); //缓存文件夹路径
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.threadPoolSize(3) // default 线程池内加载的数量
.threadPriority(Thread.NORM_PRIORITY - 2) // default 设置当前线程的优先级
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现
.memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值
.memoryCacheSizePercentage(13) // default
.diskCache(new UnlimitedDiskCache(cacheDir)) // default 可以自定义缓存路径
.diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值
.diskCacheFileCount(100) // 可以缓存的文件数量
// default为使用HASHCODE对UIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
.imageDownloader(new BaseImageDownloader(context)) // default
.imageDecoder(new BaseImageDecoder(true)) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.writeDebugLogs() // 打印debug log
.build(); //开始构建
//2.初始化配置...ImageLoader.getInstance()图片加载器的对象,单例模式
ImageLoader.getInstance().init(config);
}
/**
* imageLoader加载图片的默认选项
* @return
*/
public static DisplayImageOptions getDefaultOption(){
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.mipmap.ic_launcher) // 设置图片下载期间显示的图片
.showImageForEmptyUri(R.mipmap.ic_launcher) // 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.mipmap.ic_launcher) // 设置图片加载或解码过程中发生错误显示的图片
.resetViewBeforeLoading(true) // default 设置图片在加载前是否重置、复位
.delayBeforeLoading(1000) // 下载前的延迟时间
.cacheInMemory(true) // default 设置下载的图片是否缓存在内存中
.cacheOnDisk(true) // default 设置下载的图片是否缓存在SD卡中
.considerExifParams(true) // default
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示
.bitmapConfig(Bitmap.Config.RGB_565) // default 设置图片的解码类型
.displayer(new SimpleBitmapDisplayer()) // default 还可以设置圆角图片new RoundedBitmapDisplayer(20)
.build();
return options;
}
/**
* imageLoader加载圆角图片....指定圆角的大小
* @return
*/
public static DisplayImageOptions getRoundedOption(int corner){
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.mipmap.ic_launcher) // 设置图片下载期间显示的图片
.showImageForEmptyUri(R.mipmap.ic_launcher) // 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.mipmap.ic_launcher) // 设置图片加载或解码过程中发生错误显示的图片
.resetViewBeforeLoading(true) // default 设置图片在加载前是否重置、复位
.delayBeforeLoading(1000) // 下载前的延迟时间
.cacheInMemory(true) // default 设置下载的图片是否缓存在内存中
.cacheOnDisk(true) // default 设置下载的图片是否缓存在SD卡中
.considerExifParams(true) // default
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示
.bitmapConfig(Bitmap.Config.RGB_565) // default 设置图片的解码类型
.displayer(new RoundedBitmapDisplayer(corner)) // default 还可以设置圆角图片new RoundedBitmapDisplayer(20)
.build();
return options;
}
/**
* imageLoader加载圆形图片
* @return
*/
public static DisplayImageOptions getCircleOption(){
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.mipmap.ic_launcher) // 设置图片下载期间显示的图片
.showImageForEmptyUri(R.mipmap.ic_launcher) // 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.mipmap.ic_launcher) // 设置图片加载或解码过程中发生错误显示的图片
.resetViewBeforeLoading(true) // default 设置图片在加载前是否重置、复位
.delayBeforeLoading(1000) // 下载前的延迟时间
.cacheInMemory(true) // default 设置下载的图片是否缓存在内存中
.cacheOnDisk(true) // default 设置下载的图片是否缓存在SD卡中
.considerExifParams(true) // default
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示
.bitmapConfig(Bitmap.Config.RGB_565) // default 设置图片的解码类型
.displayer(new CircleBitmapDisplayer()) // default 还可以设置圆角图片new RoundedBitmapDisplayer(20)
.build();
return options;
}
}