天天看點

PullToRefreshListView加請求網絡資料+imageloder

//主方法

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>