ImageLoader載入圖片與文字
阿新 • • 發佈:2019-01-22
//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; importandroid.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 extendsAppCompatActivity { 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() {