经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
XListView实现网络加载图片和下拉刷新
来源:jb51  时间:2018/11/25 19:39:14  对本文有异议

 本文实例为大家分享了XListView实现网络加载图片,和下拉刷新的功能,供大家参考,具体内容如下

MainActivity.java

  1. public class MainActivity extends AppCompatActivity {
  2.  
  3. private XListView contents;
  4.  
  5. private int page = 0;
  6. private MyBaseAdapter adapter;
  7.  
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12.  
  13. contents = findViewById(R.id.contents);
  14. adapter = new MyBaseAdapter(getLayoutInflater());
  15. contents.setAdapter(adapter);
  16.  
  17. //是否开启下拉刷新 上拉加载
  18. //contents.setPullRefreshEnable(false);
  19. contents.setPullLoadEnable(true);
  20.  
  21. contents.setXListViewListener(new XListView.IXListViewListener() {
  22. @Override public void onRefresh() {
  23. page = 0;
  24. loadData(page);
  25. //加载刷新数据
  26. }
  27.  
  28. @Override public void onLoadMore() {
  29. loadData(page);
  30. }
  31. });
  32.  
  33. //一进来就去加载第一页数据
  34. loadData(page);
  35. }
  36.  
  37. private String url =
  38. "http://apis.juhe.cn/cook/query?key=3ec004200a6a2f4cf4774e480c006375&menu=%E8%A5%BF%E7%BA%A2%E6%9F%BF&rn=10&pn=";
  39.  
  40. private void loadData(int page) {
  41. String requestUrlWithPageNum = url + page;
  42.  
  43. //加载网络数据
  44. new AsyncTask<String, Void, List<DataItem>>() {
  45.  
  46. @Override protected List<DataItem> doInBackground(String... strings) {
  47. ResponseBean responseBean = null;
  48. try {
  49. URL url = new URL(strings[0]);
  50. HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
  51. urlConnection.setRequestMethod("GET");
  52. urlConnection.setConnectTimeout(5000);
  53. urlConnection.setReadTimeout(5000);
  54.  
  55. int responseCode = urlConnection.getResponseCode();
  56. if (responseCode == 200) {
  57. String str = stream2String(urlConnection.getInputStream());
  58. responseBean = new Gson().fromJson(str, ResponseBean.class);
  59. } else {
  60. //
  61. }
  62. return responseBean == null ? null : responseBean.getResult().getData();
  63. } catch (MalformedURLException e) {
  64. e.printStackTrace();
  65. } catch (IOException e) {
  66. e.printStackTrace();
  67. }
  68.  
  69. return null;
  70. }
  71.  
  72. @Override protected void onPostExecute(List<DataItem> dataItems) {
  73. if (dataItems == null) {
  74. Toast.makeText(MainActivity.this, "请求数据错误", Toast.LENGTH_LONG).show();
  75. return;
  76. }
  77.  
  78. //更新数据
  79. updateData(dataItems);
  80. loadCompleted();
  81. }
  82. }.execute(url);
  83. }
  84.  
  85. private String stream2String(InputStream is) throws IOException {
  86. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  87. StringBuilder sb = new StringBuilder();
  88. for (String tmp = br.readLine(); tmp != null; tmp = br.readLine()) {
  89. sb.append(tmp);
  90. }
  91.  
  92. return sb.toString();
  93. }
  94.  
  95. private void updateData(List<DataItem> datas) {
  96. if (page == 0) {
  97. adapter.setDatas(datas);
  98. } else {
  99. adapter.addDatas(datas);
  100. }
  101. }
  102.  
  103. //通过 加载 / 刷新 完成
  104. private void loadCompleted() {
  105. //通过ListView:刷新、加载完成
  106. page++;
  107. contents.stopLoadMore();
  108. contents.stopRefresh();
  109. }
  110. }

MyBaseAdapter.java

  1. public class MyBaseAdapter extends BaseAdapter {
  2.  
  3. private List<DataItem> mDatas;
  4. protected LayoutInflater mInflater;
  5.  
  6. /**
  7. * 更新数据
  8. */
  9. public void setDatas(List<DataItem> datas) {
  10. mDatas.clear();
  11. if (datas != null) {
  12. mDatas.addAll(datas);
  13. }
  14. notifyDataSetChanged();
  15. }
  16.  
  17. /**
  18. * 追加数据
  19. */
  20. public void addDatas(List<DataItem> datas) {
  21. if (datas != null) {
  22. mDatas.addAll(datas);
  23. notifyDataSetChanged();
  24. }
  25. }
  26.  
  27. public MyBaseAdapter(LayoutInflater mInflater) {
  28. this.mInflater = mInflater;
  29. mDatas = new ArrayList<>();
  30. }
  31.  
  32. @Override public int getCount() {
  33. return mDatas.size();
  34. }
  35.  
  36. @Override public DataItem getItem(int position) {
  37. return mDatas.get(position);
  38. }
  39.  
  40. @Override public long getItemId(int position) {
  41. return position;
  42. }
  43.  
  44. @Override public View getView(int position, View convertView, ViewGroup parent) {
  45. BaseViewHolder viewHolder = null;
  46.  
  47. if (convertView == null) {
  48. convertView = mInflater.inflate(R.layout.item, parent, false);
  49. viewHolder = new BaseViewHolder(convertView);
  50. } else {
  51. viewHolder = (BaseViewHolder) convertView.getTag();
  52. }
  53.  
  54. viewHolder.bindData(getItem(position));
  55.  
  56. return convertView;
  57. }
  58.  
  59. public class BaseViewHolder {
  60. private View itemView;
  61.  
  62. private ImageView icon;
  63. private TextView title;
  64. private TextView date;
  65.  
  66. public BaseViewHolder(View itemView) {
  67. this.itemView = itemView;
  68. title = itemView.findViewById(R.id.title);
  69. date = itemView.findViewById(R.id.date);
  70. icon = itemView.findViewById(R.id.icon);
  71.  
  72. itemView.setTag(this);
  73. }
  74.  
  75. public void bindData(DataItem dataItem) {
  76. title.setText(dataItem.getTitle());
  77. date.setText(dataItem.getId());
  78. ImageLoader.getInstance().displayImage(dataItem.getFirstImageUrl(), icon,
  79. ImageLoaderConfigs.getDefaultDisplayImageOptions(icon.getContext()));
  80. }
  81. }
  82. }
  83. ImageLoader.java
  84. public class ImageLoaderConfigs {
  85. public static ImageLoaderConfiguration getImageLoaderConfiguration(Context context) {
  86. ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)
  87. //内在缓存额外选项, 最大的宽度,高度
  88. //.memoryCacheExtraOptions(480, 800) // default = device screen dimensions 内存缓存文件的最大长宽
  89. //.diskCacheExtraOptions(480, 800, null) // 本地缓存的详细信息(缓存的最大长宽),最好不要设置这个
  90. //线程池配置
  91. //.taskExecutor()
  92. //.taskExecutorForCachedImages()
  93. //.threadPoolSize(3) // default 线程池内加载的数量
  94. //.threadPriority(Thread.NORM_PRIORITY - 2) // default 设置当前线程的优先级
  95. //任务处理优先级 Fist In Fist Out
  96. //.tasksProcessingOrder(QueueProcessingType.FIFO) // default
  97. //内存中不缓存一张图片的多个尺寸大小
  98. //.denyCacheImageMultipleSizesInMemory()
  99. //内在缓存策略
  100. //.memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现
  101. //内存缓存大小
  102. //.memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值
  103. //内在缓存大小:占用百分比
  104. .memoryCacheSizePercentage(13) // default
  105. //磁盘缓存策略
  106. //.diskCache(new LruDiskCache()) // default 可以自定义缓存路径
  107. //磁盘缓存大小
  108. .diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值
  109. //.diskCacheFileCount(100) // 可以缓存的文件数量
  110. // default为使用HASHCODE对UIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密
  111. //.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
  112. //.imageDownloader(new BaseImageDownloader(context)) // default
  113. //(new BaseImageDecoder(false)) // default
  114. //加载具体图片时的一些配置
  115. .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
  116. .writeDebugLogs() // 打印debug log
  117. .build();
  118.  
  119. return configuration;
  120. }
  121.  
  122. public static DisplayImageOptions getDefaultDisplayImageOptions(Context context) {
  123. DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
  124. //是否缓存
  125. .cacheInMemory(true)
  126. .cacheOnDisk(true)
  127. //RGB 565 r红色占5 g绿色占6 b蓝色占5 -> 2字节
  128. //alpha
  129. //ARGB 4444 4 4 4 4 -> 2字节
  130. //ARGB 8888 -> 4字节
  131.  
  132. //10 * 10 用rgb565 -> 10*10*2
  133.  
  134. .bitmapConfig(Bitmap.Config.RGB_565)
  135. //加载时、加载错误时展示什么内容
  136. .showImageOnLoading(R.mipmap.ic_launcher)
  137. .showImageOnFail(R.mipmap.ic_launcher)
  138. //
  139. .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
  140.  
  141. //加载效果
  142. //ctrl + p
  143. .displayer(new CircleBitmapDisplayer())
  144. .build();
  145.  
  146. //ctrl + h
  147. //BitmapDisplayer;
  148. return displayImageOptions;
  149. }
  150. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号