//主方法
package com.example.day19_rikao;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.example.day19_rikao.Bean.bean;
import com.google.gson.Gson;
import com.handmark.pulltorefresh.library.ILoadingLayout;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private PullToRefreshListView pullToRefreshListView;
private StringBuilder builder;
private List<bean.NewslistBean> list = new ArrayList<>();
private Handler myHandler=new Handler();
private MyAdapter adapter;
int index=1;
int type=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pullToRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_lv);
init();
initLv();
}
class Mytask extends AsyncTask<String,Void,String>{
@Override
protected String doInBackground(String... strings) {
try {
//擷取url
URL url = new URL(strings[0]);
//請求網絡
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
int code = urlConnection.getResponseCode();
//判斷是否傳回成功
if(code==200){
//擷取網絡資訊
InputStream inputStream = urlConnection.getInputStream();
BufferedReader bf = new BufferedReader(new InputStreamReader(inputStream));
builder = new StringBuilder();
String s = "";
//拼接
while((s=bf.readLine())!=null){
builder.append(s);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return builder.toString();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Gson gson = new Gson();
bean json = gson.fromJson(s, bean.class);
List<bean.NewslistBean> list1 = json.getNewslist();
//list.addAll(list1);
if(type==1){
list.addAll(0,list1);
}else {
list.addAll(list1);
}
setAdapter();
}
}
public void setAdapter(){
if(adapter==null){
adapter=new MyAdapter();
pullToRefreshListView.setAdapter(adapter);
}else{
adapter.notifyDataSetChanged();
}
}
public void init(){
Mytask mytask=new Mytask();
mytask.execute("https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10&page=1");
}
public void addtoTop(){
type=1;
index++;
Mytask mytask=new Mytask();
mytask.execute("https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10&page="+index);
}
public void addtoBottom(){
type=2;
index++;
Mytask mytask=new Mytask();
mytask.execute("https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10&page="+index);
}
public void initLv(){
//設定重新整理模式 ,both代表支援上拉和下拉,pull_from_end代表上拉,pull_from_start代表下拉
pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH);
ILoadingLayout startLabels = pullToRefreshListView.getLoadingLayoutProxy(true, false);
startLabels.setPullLabel("下拉重新整理");
startLabels.setRefreshingLabel("正在拉");
startLabels.setReleaseLabel("放開重新整理");
ILoadingLayout endLabels = pullToRefreshListView.getLoadingLayoutProxy(false, true);
endLabels.setPullLabel("上拉重新整理");
endLabels.setRefreshingLabel("正在載入...");
endLabels.setReleaseLabel("放開重新整理...");
pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {//下拉重新整理的回調
//下拉重新整理的資料,顯示在listview清單的最上面
addtoTop();
myHandler.postDelayed(new Runnable() {
@Override
public void run() {
//重新整理完成,必須在異步下完成
pullToRefreshListView.onRefreshComplete();
//重新整理擴充卡
}
},1000);
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {//上拉加載的回調
//加載更多的資料,添加到集合清單的最後面
addtoBottom();
myHandler.postDelayed(new Runnable() {
@Override
public void run() {
//重新整理完成,必須在異步下完成
pullToRefreshListView.onRefreshComplete();
//重新整理擴充卡
}
},1000);
}
});
}
class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Viewholder vh;
if(convertView==null){
vh=new Viewholder();
convertView=View.inflate(MainActivity.this,R.layout.item,null);
vh.img=(ImageView) convertView.findViewById(R.id.imageView);
vh.tv=(TextView) convertView.findViewById(R.id.textView);
convertView.setTag(vh);
}else{
vh= (Viewholder) convertView.getTag();
}
vh.tv.setText(list.get(position).getTitle());
ImageLoader.getInstance().displayImage(list.get(position).getPicUrl(),vh.img);
return convertView;
}
}
public static class Viewholder{
ImageView img;
TextView tv;
}
}
//imageloder類
package com.example.day19_rikao;
import android.app.Application;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import java.io.File;
public class Myapp extends Application{
@Override
public void onCreate() {
super.onCreate();
File file = getExternalCacheDir();
ImageLoaderConfiguration build = new ImageLoaderConfiguration.Builder(this).memoryCacheExtraOptions(200, 200)//配置記憶體緩存圖檔的尺寸
.memoryCacheSize(2 * 1024 * 1024)//配置記憶體緩存的大小
.threadPoolSize(3)//配置加載圖檔的線程數
.threadPriority(1000)//配置線程的優先級
.diskCache(new UnlimitedDiskCache(file))//UnlimitedDiskCache 限制這個圖檔的緩存路徑
.diskCacheFileCount(50)//配置sdcard緩存檔案的數量
.diskCacheFileNameGenerator(new Md5FileNameGenerator())//MD5這種方式生成緩存檔案的名字
.diskCacheSize(50 * 1024 * 1024)//在sdcard緩存50MB .memoryCacheExtraOptions(200, 200)//配置記憶體緩存圖檔的尺寸
.memoryCacheSize(2 * 1024 * 1024)//配置記憶體緩存的大小
.threadPoolSize(3)//配置加載圖檔的線程數
.threadPriority(1000)//配置線程的優先級
.diskCache(new UnlimitedDiskCache(file))//UnlimitedDiskCache 限制這個圖檔的緩存路徑
.diskCacheFileCount(50)//配置sdcard緩存檔案的數量
.diskCacheFileNameGenerator(new Md5FileNameGenerator())//MD5這種方式生成緩存檔案的名字
.diskCacheSize(50 * 1024 * 1024)//在sdcard緩存50MB
.build();
ImageLoader.getInstance().init(build);
}
}
//Bean類
package com.example.day19_rikao.Bean;
import java.util.List;
public class bean {
private int code;
private String msg;
private List<NewslistBean> newslist;
public bean(int code, String msg, List<NewslistBean> newslist) {
this.code = code;
this.msg = msg;
this.newslist = newslist;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public List<NewslistBean> getNewslist() {
return newslist;
}
public void setNewslist(List<NewslistBean> newslist) {
this.newslist = newslist;
}
public static class NewslistBean {
private String ctime;
private String title;
private String description;
private String picUrl;
private String url;
public String getCtime() {
return ctime;
}
public void setCtime(String ctime) {
this.ctime = ctime;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getPicUrl() {
return picUrl;
}
public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
}
//布局
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout tools:context="com.example.day19_rikao.MainActivity" android:layout_height="match_parent" android:layout_width="match_parent" xmlns:tools="http://schemas.android.com/tools" xmlns:ptr="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android">
<com.handmark.pulltorefresh.library.PullToRefreshListView android:id="@+id/pull_lv" android:layout_height="match_parent" android:layout_width="match_parent" ptr:ptrHeaderTextColor="#FFFFFF" ptr:ptrHeaderBackground="#383838" ptr:ptrAnimationStyle="flip" ptr:ptrDrawable="@drawable/default_ptr_flip"/>
</RelativeLayout>
//item布局
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout android:orientation="horizontal" android:layout_height="match_parent" android:layout_width="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView android:id="@+id/imageView" android:layout_height="100dp" android:layout_width="100dp" app:srcCompat="@mipmap/ic_launcher"/>
<TextView android:id="@+id/textView" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="TextView"/>
</LinearLayout>