1. 程式人生 > >ImageLoader載入圖片與文字

ImageLoader載入圖片與文字

//main方法

import android.support.annotation.IdRes;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import 
android.widget.RadioGroup; import com.example.week02.Fragment.GengDuoFragment; import com.example.week02.Fragment.ShiChangFragment; import com.example.week02.Fragment.ShouYeFragment; import com.example.week02.Fragment.TongZhiFragment; import com.example.week02.Fragment.XiangFaFragment; public class MainActivity extends
AppCompatActivity { private RadioGroup radioGroup; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); radioGroup = (RadioGroup) findViewById(R.id.radio_group); radioGroup
.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) { switch (checkedId){ case R.id.radio_01: addFragment(new ShouYeFragment()); break; case R.id.radio_02: addFragment(new XiangFaFragment()); break; case R.id.radio_03: addFragment(new ShiChangFragment()); break; case R.id.radio_04: addFragment(new TongZhiFragment()); break; case R.id.radio_05: addFragment(new GengDuoFragment()); break; default: break; } } }); //新增首頁 頁面 addFragment(new ShouYeFragment()); } public void addFragment(Fragment f){ FragmentManager manager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = manager.beginTransaction(); fragmentTransaction.replace(R.id.frame_layout,f); fragmentTransaction.commit(); } } 

//介面卡

public class MyLvAdapter extends BaseAdapter{
    private List<Result.ResultsBean> lists;
    private Context context;

    //定義檢視型別
private final int TYPE_TITLE=0;
    private final int TYPE_PIC=1;

    public MyLvAdapter(List<Result.ResultsBean> lists, Context context) {
        this.lists = lists;
        this.context = context;
    }

    @Override
public int getCount() {
        return lists.size();
    }


    //返回檢視型別的數量
@Override
public int getViewTypeCount() {
        return 2;
    }

    //根據當前的條目的下標,返回此條目對應的檢視型別
@Override
public int getItemViewType(int position) {
        //根據資料去判斷返回的型別
Result.ResultsBean entity=lists.get(position);
        List<String> imgurl=entity.getImages();
        if(imgurl==null){
            return TYPE_TITLE;
        }else{
            return TYPE_PIC;
        }

    }

    @Override
public View getView(int position, View convertView, ViewGroup parent) {
        //根據position得到檢視型別
int type=getItemViewType(position);
        if(type==TYPE_TITLE){
            ViewHolderTitle holderTitle;
            if(convertView==null){
                holderTitle=new ViewHolderTitle();
                convertView=View.inflate(context, R.layout.item_pic,null);
                holderTitle.textView=(TextView) convertView.findViewById(R.id.tv_title);
                convertView.setTag(holderTitle);

            }else{
                holderTitle=(ViewHolderTitle) convertView.getTag();
            }
            holderTitle.textView.setText(lists.get(position).getDesc());


        }else if(type==TYPE_PIC){

            ViewHolderPic holderPic;
            if(convertView==null){
                holderPic=new ViewHolderPic();
                convertView=View.inflate(context, R.layout.item_pic,null);
                holderPic.textView=(TextView) convertView.findViewById(R.id.tv_title);
                holderPic.imageView=(ImageView) convertView.findViewById(R.id.img);
                convertView.setTag(holderPic);

            }else{
                holderPic=(ViewHolderPic) convertView.getTag();
            }
            holderPic.textView.setText(lists.get(position).getDesc());

            //載入圖片
ImageLoader.getInstance().displayImage(
                    lists.get(position).getImages().get(0),
                    holderPic.imageView,
                    ImageloaderUtil.getImageOptions());
        }

        return convertView;
    }

    @Override
public long getItemId(int position) {
        return position;
    }

    @Override
public Object getItem(int position) {
        return lists.get(position);
    }

    class ViewHolderTitle{
        TextView textView;
    }

    class ViewHolderPic{
        TextView textView;
        ImageView imageView;
    }

}

//介面卡

public class MyPagerAdapter extends FragmentPagerAdapter {

    //選項卡文字列表
private List<String> tabs;

    public MyPagerAdapter(FragmentManager fm, List<String> tabs) {
        super(fm);
        this.tabs = tabs;
    }

    //用於返回選項卡的文字
@Override
public CharSequence getPageTitle(int position) {
        return  tabs.get(position);
    }

    @Override
public Fragment getItem(int position) {

//        if(position==0){
//            return new DongTaiFragment();
//        }else if()
Fragment f=null;

        switch (position){

            case 0:
                f=new DongTaiFragment();//動態頁面
break;
            case 1:
                f=new ContentFramgnet();//熱門頁面
break;

            case 2:
                f=new FindFragment();//發現頁面
break;
        }

        return f;
    }

    @Override
public int getCount() {
        return tabs.size();
    }
}

//工具包

public class ImageloaderUtil {
    /**
     * ImageLoader的配置
* @param context
*/
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 UnlimitedDiskCache(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;

    }
}

//工具包

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.setRequestMethod("GET");
            connection.setReadTimeout(5000);
            connection.setConnectTimeout(5000);

            if(connection.getResponseCode()==200){
                InputStream inputStream=connection.getInputStream();
                //呼叫工具類中的靜態方法
str=StreamToString.streamToStr(inputStream,"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.updateUiByjson(s);



    }
    //定義一個介面
public interface Icallbacks{
        /**
         * 根據回傳的json字串,解析並更新頁面元件
* @param jsonstr
*/
void updateUiByjson(String jsonstr);
    }
}

//工具包

public class NetStateUtil {

    /*
 * 判斷網路連線是否已開 * true 已開啟  false 未開啟 * */
public static boolean isConn(Context context){
        boolean bisConnFlag=false;
        ConnectivityManager conManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo network = conManager.getActiveNetworkInfo();
        if(network!=null){
            bisConnFlag=conManager.getActiveNetworkInfo().isAvailable();
        }
        return bisConnFlag;
    }

    /**
     * 當判斷當前手機沒有網路時選擇是否開啟網路設定
* @param context
*/
public static void showNoNetWorkDlg(final Context context) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setIcon(R.mipmap.ic_launcher)         //
.setTitle(R.string.app_name)            //
.setMessage("當前無網路").setPositiveButton("設定", new DialogInterface.OnClickListener() {

            @Override
public void onClick(DialogInterface dialog, int which) {
                // 跳轉到系統的網路設定介面
Intent intent = null;
                // 先判斷當前系統版本
if(android.os.Build.VERSION.SDK_INT > 10){  // 3.0以上
intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS);
                }else{
                    intent = new Intent();
                    intent.setClassName("com.android.settings", "com.android.settings.WirelessSettings");
                }
                context.startActivity(intent);

            }
        }).setNegativeButton("知道了", null).show();
    }
}

//工具包

public class StreamToString {

    public static String streamToStr(InputStream inputStream,String chartSet){

        StringBuilder builder=new StringBuilder();
        try {
            BufferedReader br=new BufferedReader(new InputStreamReader(inputStream,chartSet));
            String con;
            while ((con=br.readLine())!=null){
                builder.append(con);
            }

            br.close();
            return builder.toString();


        } catch (Exception e) {
            e.printStackTrace();
        }


        return "";
    }
}

//呼叫工具包

public class MyApplication extends Application {

    @Override
public void onCreate() {
        super.onCreate();

        ImageloaderUtil.initConfig(this);

    }
}

//Bean包解析資料

public class Result {


    /**
     * error : false
     * results : [{"_id":"59de2f22421aa90fe50c015c","createdAt":"2017-10-11T22:48:02.721Z","desc":"Kotlin 實現的基於物理的動畫","images":["http://img.gank.io/58925abb-3e11-4d6e-9e44-a4567c03d03f"],"publishedAt":"2017-10-17T13:10:43.731Z","source":"web","type":"Android","url":"https://github.com/sagar-viradiya/AndroidPhysicsAnimation","used":true,"who":" Thunder Bouble"},{"_id":"59e46c6a421aa90fe50c0174","createdAt":"2017-10-16T16:23:06.637Z","desc":"Android 通用圓角佈局,快速實現圓角需求。","images":["http://img.gank.io/4d9b99ba-cc97-4ef8-b834-477ad8a97100"],"publishedAt":"2017-10-17T13:10:43.731Z","source":"web","type":"Android","url":"https://github.com/GcsSloop/rclayout","used":true,"who":"sloop"},{"_id":"59e46c89421aa90fe7253598","createdAt":"2017-10-16T16:23:37.313Z","desc":"Android 加密工具包。","publishedAt":"2017-10-17T13:10:43.731Z","source":"web","type":"Android","url":"https://github.com/GcsSloop/encrypt","used":true,"who":"sloop"},{"_id":"59e55ecd421aa90fe725359c","createdAt":"2017-10-17T09:37:17.526Z","desc":"一個用 Kotlin 寫的輕量級 URL 路由器框架","publishedAt":"2017-10-17T13:10:43.731Z","source":"web","type":"Android","url":"https://github.com/twocity/linker","used":true,"who":"ZhangTitanjum"},{"_id":"59e5740f421aa90fe725359f","createdAt":"2017-10-17T11:07:59.933Z","desc":"Android面試指南:我們需要怎樣的工程師,我們需要成為怎樣的工程師?","publishedAt":"2017-10-17T13:10:43.731Z","source":"web","type":"Android","url":"https://mp.weixin.qq.com/s?__biz=MzU4MjAzNTAwMA==&mid=2247483781&idx=2&sn=c5ef46cea309df058d2b168fada6dec0&chksm=fdbf32d2cac8bbc4b7f373c76bfc4d2447717634fdbc5afae565cca92551bfd152b329d5e103#rd","used":true,"who":null},{"_id":"59df3eac421aa90fef20347c","createdAt":"2017-10-12T18:06:36.692Z","desc":"文章中詳實說明利用Cmake構造Ndk庫需要注意的問題,以及部分Cmake命令的解讀。","publishedAt":"2017-10-16T12:19:20.311Z","source":"web","type":"Android","url":"http://blog.csdn.net/qq_34902522/article/details/78144127","used":true,"who":null},{"_id":"59e1b47b421aa90fef203481","createdAt":"2017-10-14T14:53:47.998Z","desc":"詳細介紹java垃圾回收的過程及相關演算法","publishedAt":"2017-10-16T12:19:20.311Z","source":"chrome","type":"Android","url":"https://mp.weixin.qq.com/s?__biz=MzIwODI3MTc2Ng==&mid=2649647405&idx=1&sn=46a48cedd1540a994cd316ca164e005a&chksm=8f1f69d4b868e0c25245676ac55dc8d1fcad3dfa4bc63a2e0835b0a1155f1d2320a45a7c7078#rd","used":true,"who":"技術特工隊"},{"_id":"59e4092c421aa90fe50c016d","createdAt":"2017-10-16T09:19:40.793Z","desc":"幾條小經驗幫你美化你的GitHub開源專案","publishedAt":"2017-10-16T12:19:20.311Z","source":"web","type":"Android","url":"https://mp.weixin.qq.com/s?__biz=MzIwMzYwMTk1NA==&mid=2247487344&idx=1&sn=744a9ebc0425fb3fa17c3f62eb59e421","used":true,"who":"陳宇明"},{"_id":"59dc7149421aa94e07d18490","createdAt":"2017-10-10T15:05:45.902Z","desc":"使用 Kotlin 實現的一個 Dribbble 客戶端","images":["http://img.gank.io/05d6552f-97ba-4d52-ad33-3caeba5cb327","http://img.gank.io/84594f1b-d10e-42a3-afc1-c7d2bf9ac0cf"],"publishedAt":"2017-10-11T12:40:42.545Z","source":"web","type":"Android","url":"https://github.com/armcha/Ribble","used":true,"who":" Thunder Bouble"},{"_id":"59dcca81421aa94e0053bddf","createdAt":"2017-10-10T21:26:25.797Z","desc":"最近在給某某銀行做專案的時,涉及到了資料埋點,效能監控等問題,那我們起先想到的有兩種方案,方案之一就是藉助第三方,比如友盟、Bugly等,由於專案是部署在銀行的網路框架之內的,所以該方案不可行。","publishedAt":"2017-10-11T12:40:42.545Z","source":"web","type":"Android","url":"https://mp.weixin.qq.com/s?__biz=MzIyMjQ0MTU0NA==&mid=2247484445&idx=1&sn=8eef04a7932b58ef0012643db228fb32&chksm=e82c3d3adf5bb42c88333160a88c7b05fb5f45798434afa956fe1f1a58c7713ef121c7ea0af4&scene=0&key=7460e137ddd94f92f668e812cfc0aef8fde2bdf7943c7409875cce12a3baed3526f31e4a707ed86896ee8ddbbf761bb2f09b2d7406c3b9016589495240d835d967a2141231c43d084635a7df11647fb0&ascene=0&uin=MjMzMzgwOTEwMQ%3D%3D&devicetype=iMac+MacBookPro12%2C1+OSX+OSX+10.10.5+build(14F27)&version=11020201&pass_ticket=54ym37fDoXgDZm7nzjGt6KNDR9%2F9ZIU8%2Bo5kNcGEXqi8GKijls6et5TXcXxbERi%2F","used":true,"who":"Tamic (碼小白)"}]
     */
private boolean error;
    private List<ResultsBean> results;

    public boolean isError() {
        return error;
    }

    public void setError(boolean error) {
        this.error = error;
    }

    public List<ResultsBean> getResults() {
        return results;
    }

    public void setResults(List<ResultsBean> results) {
        this.results = results;
    }

    public static class ResultsBean {
        /**
         * _id : 59de2f22421aa90fe50c015c
         * createdAt : 2017-10-11T22:48:02.721Z
         * desc : Kotlin 實現的基於物理的動畫
* images : ["http://img.gank.io/58925abb-3e11-4d6e-9e44-a4567c03d03f"]
         * publishedAt : 2017-10-17T13:10:43.731Z
         * source : web
         * type : Android
         * url : https://github.com/sagar-viradiya/AndroidPhysicsAnimation
         * used : true
         * who :  Thunder Bouble
         */
private String _id;
        private String createdAt;
        private String desc;
        private String publishedAt;
        private String source;
        private String type;
        private String url;
        private boolean used;
        private String who;
        private List<String> images;

        public String get_id() {
            return _id;
        }

        public void set_id(String _id) {
            this._id = _id;
        }

        public String getCreatedAt() {
            return createdAt;
        }

        public void setCreatedAt(String createdAt) {
            this.createdAt = createdAt;
        }

        public String getDesc() {
            return desc;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }

        public String getPublishedAt() {
            return publishedAt;
        }

        public void setPublishedAt(String publishedAt) {
            this.publishedAt = publishedAt;
        }

        public String getSource() {
            return source;
        }

        public void setSource(String source) {
            this.source = source;
        }

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }

        public boolean isUsed() {
            return used;
        }

        public void setUsed(boolean used) {
            this.used = used;
        }

        public String getWho() {
            return who;
        }

        public void setWho(String who) {
            this.who = who;
        }

        public List<String> getImages() {
            return images;
        }

        public void setImages(List<String> images) {
            this.images = images;
        }
    }
}

//Fragment

public class ContentFramgnet extends Fragment {

    private View v;
    private int pageIndex=1;
    private MyLvAdapter lvAdapter;
    private List<Result.ResultsBean> lists=new ArrayList<>();
    private XListView xlv;

    @Nullable
    @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        v = View.inflate(getActivity(), R.layout.content,null);

        xlv = (XListView) v.findViewById(R.id.xlv);

        //進行設定
xlv.setPullRefreshEnable(true);
        xlv.setPullLoadEnable(true);


        //設定監聽
xlv.setXListViewListener(new XListView.IXListViewListener() {
            @Override
public void onRefresh() {

                pageIndex=1;

                MyTask mytask=new MyTask(new MyTask.Icallbacks() {
                    @Override
public void updateUiByjson(String jsonstr) {
                        Gson gson=new Gson();
                        Result result=gson.fromJson(jsonstr, Result.class);
                        //要顯示的資料-新增到最前面
lists.addAll(0,result.getResults());
                        //設定介面卡
setAdapter();

                        //關閉檢視
new Handler().postDelayed(new Runnable() {
                            @Override
public void run() {
                                xlv.stopRefresh();
                            }
                        },1000);
                    }
                });
                mytask.execute("http://gank.io/api/data/Android/10/"+pageIndex);


            }

            @Override
public void onLoadMore() {
                pageIndex++;

                MyTask mytask=new MyTask(new MyTask.Icallbacks() {
                    @Override
public void updateUiByjson(String jsonstr) {
                        Gson gson=new Gson();
                        Result result=gson.fromJson(jsonstr, Result.class);
                        //要顯示的資料
lists.addAll(result.getResults());
                        //設定介面卡
setAdapter();

                        //關閉檢視
new Handler().postDelayed(new Runnable() {
                            @Override
public void run() {
                                xlv.stopLoadMore();

                            }
                        },1000);
                    }
                });
                mytask.execute("http://gank.io/api/data/Android/10/"+pageIndex);

            }
        });

        return v;
    }


    public void setAdapter(){
        if(lvAdapter==null){
            lvAdapter=new MyLvAdapter(lists,getActivity());
            xlv.setAdapter(lvAdapter);

        }else{
            lvAdapter.notifyDataSetChanged();
        }
    }

    private void requestNetData() {
        MyTask mytask=new MyTask(new MyTask.Icallbacks() {
            @Override
public void updateUiByjson(String jsonstr) {
                Gson gson=new Gson();
                Result result=gson.fromJson(jsonstr, Result.class);
                //要顯示的資料
lists.addAll(result.getResults());
                //設定介面卡
setAdapter();
            }
        });
        mytask.execute("http://gank.io/api/data/Android/10/"+pageIndex);


    }

    @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        requestNetData();
    }
}



//Fragment

public class DongTaiFragment extends Fragment {

    private XListView xlv;
    private int pageIndex=1;
    private MyLvAdapter lvAdapter;
    private List<Result.ResultsBean> lists=new ArrayList<>();
    @Nullable
    @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View inflate = inflater.inflate(R.layout.don_layout, null);
        xlv = (XListView) inflate.findViewById(R.id.xlv);
        xlv = (XListView) inflate.findViewById(R.id.xlv);

        //進行設定
xlv.setPullRefreshEnable(true);
        xlv.setPullLoadEnable(true);


        //設定監聽
xlv.setXListViewListener(new XListView.IXListViewListener() {