XListView实现网络加载图片和下拉刷新

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

MainActivity.java

public class MainActivity extends AppCompatActivity {

 private XListView contents;

 private int page = 0;
 private MyBaseAdapter adapter;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  contents = findViewById(R.id.contents);
  adapter = new MyBaseAdapter(getLayoutInflater());
  contents.setAdapter(adapter);

  //是否开启下拉刷新 上拉加载
  //contents.setPullRefreshEnable(false);
  contents.setPullLoadEnable(true);

  contents.setXListViewListener(new XListView.IXListViewListener() {
   @Override public void onRefresh() {
    page = 0;
    loadData(page);
    //加载刷新数据
   }

   @Override public void onLoadMore() {
    loadData(page);
   }
  });

  //一进来就去加载第一页数据
  loadData(page);
 }

 private String url =
   "http://apis.juhe.cn/cook/query?key=3ec004200a6a2f4cf4774e480c006375&menu=%E8%A5%BF%E7%BA%A2%E6%9F%BF&rn=10&pn=";

 private void loadData(int page) {
  String requestUrlWithPageNum = url + page;

  //加载网络数据
  new AsyncTask<String, Void, List<DataItem>>() {

   @Override protected List<DataItem> doInBackground(String... strings) {
    ResponseBean responseBean = null;
    try {
     URL url = new URL(strings[0]);
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
     urlConnection.setRequestMethod("GET");
     urlConnection.setConnectTimeout(5000);
     urlConnection.setReadTimeout(5000);

     int responseCode = urlConnection.getResponseCode();
     if (responseCode == 200) {
      String str = stream2String(urlConnection.getInputStream());
      responseBean = new Gson().fromJson(str, ResponseBean.class);
     } else {
      //
     }
     return responseBean == null ? null : responseBean.getResult().getData();
    } catch (MalformedURLException e) {
     e.printStackTrace();
    } catch (IOException e) {
     e.printStackTrace();
    }

    return null;
   }

   @Override protected void onPostExecute(List<DataItem> dataItems) {
    if (dataItems == null) {
     Toast.makeText(MainActivity.this, "请求数据错误", Toast.LENGTH_LONG).show();
     return;
    }

    //更新数据
    updateData(dataItems);
    loadCompleted();
   }
  }.execute(url);
 }

 private String stream2String(InputStream is) throws IOException {
  BufferedReader br = new BufferedReader(new InputStreamReader(is));
  StringBuilder sb = new StringBuilder();
  for (String tmp = br.readLine(); tmp != null; tmp = br.readLine()) {
   sb.append(tmp);
  }

  return sb.toString();
 }

 private void updateData(List<DataItem> datas) {
  if (page == 0) {
   adapter.setDatas(datas);
  } else {
   adapter.addDatas(datas);
  }
 }

 //通过 加载 / 刷新 完成
 private void loadCompleted() {
  //通过ListView:刷新、加载完成
  page++;
  contents.stopLoadMore();
  contents.stopRefresh();
 }
}

MyBaseAdapter.java

public class MyBaseAdapter extends BaseAdapter {

 private List<DataItem> mDatas;
 protected LayoutInflater mInflater;

 /**
  * 更新数据
  */
 public void setDatas(List<DataItem> datas) {
  mDatas.clear();
  if (datas != null) {
   mDatas.addAll(datas);
  }
  notifyDataSetChanged();
 }

 /**
  * 追加数据
  */
 public void addDatas(List<DataItem> datas) {
  if (datas != null) {
   mDatas.addAll(datas);
   notifyDataSetChanged();
  }
 }

 public MyBaseAdapter(LayoutInflater mInflater) {
  this.mInflater = mInflater;
  mDatas = new ArrayList<>();
 }

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

 @Override public DataItem getItem(int position) {
  return mDatas.get(position);
 }

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

 @Override public View getView(int position, View convertView, ViewGroup parent) {
  BaseViewHolder viewHolder = null;

  if (convertView == null) {
   convertView = mInflater.inflate(R.layout.item, parent, false);
   viewHolder = new BaseViewHolder(convertView);
  } else {
   viewHolder = (BaseViewHolder) convertView.getTag();
  }

  viewHolder.bindData(getItem(position));

  return convertView;
 }

 public class BaseViewHolder {
  private View itemView;

  private ImageView icon;
  private TextView title;
  private TextView date;

  public BaseViewHolder(View itemView) {
   this.itemView = itemView;
   title = itemView.findViewById(R.id.title);
   date = itemView.findViewById(R.id.date);
   icon = itemView.findViewById(R.id.icon);

   itemView.setTag(this);
  }

  public void bindData(DataItem dataItem) {
   title.setText(dataItem.getTitle());
   date.setText(dataItem.getId());
   ImageLoader.getInstance().displayImage(dataItem.getFirstImageUrl(), icon,
     ImageLoaderConfigs.getDefaultDisplayImageOptions(icon.getContext()));
  }
 }
}
ImageLoader.java
  public class ImageLoaderConfigs {
 public static ImageLoaderConfiguration getImageLoaderConfiguration(Context context) {
  ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)
    //内在缓存额外选项, 最大的宽度,高度
    //.memoryCacheExtraOptions(480, 800) // default = device screen dimensions 内存缓存文件的最大长宽
    //.diskCacheExtraOptions(480, 800, null) // 本地缓存的详细信息(缓存的最大长宽),最好不要设置这个
    //线程池配置
    //.taskExecutor()
    //.taskExecutorForCachedImages()
    //.threadPoolSize(3) // default 线程池内加载的数量
    //.threadPriority(Thread.NORM_PRIORITY - 2) // default 设置当前线程的优先级
    //任务处理优先级 Fist In Fist Out
    //.tasksProcessingOrder(QueueProcessingType.FIFO) // default
    //内存中不缓存一张图片的多个尺寸大小
    //.denyCacheImageMultipleSizesInMemory()
    //内在缓存策略
    //.memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现
    //内存缓存大小
    //.memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值
    //内在缓存大小:占用百分比
    .memoryCacheSizePercentage(13) // default
    //磁盘缓存策略
    //.diskCache(new LruDiskCache()) // default 可以自定义缓存路径
    //磁盘缓存大小
    .diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值
    //.diskCacheFileCount(100) // 可以缓存的文件数量
    // default为使用HASHCODE对UIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密
    //.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
    //.imageDownloader(new BaseImageDownloader(context)) // default
    //(new BaseImageDecoder(false)) // default
    //加载具体图片时的一些配置
    .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
    .writeDebugLogs() // 打印debug log
    .build();

  return configuration;
 }

 public static DisplayImageOptions getDefaultDisplayImageOptions(Context context) {
  DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
    //是否缓存
    .cacheInMemory(true)
    .cacheOnDisk(true)
    //RGB 565  r红色占5  g绿色占6  b蓝色占5 -> 2字节
    //alpha
    //ARGB 4444  4 4 4 4 -> 2字节
    //ARGB 8888  -> 4字节

    //10 * 10 用rgb565 -> 10*10*2

    .bitmapConfig(Bitmap.Config.RGB_565)
    //加载时、加载错误时展示什么内容
    .showImageOnLoading(R.mipmap.ic_launcher)
    .showImageOnFail(R.mipmap.ic_launcher)
    //
    .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)

    //加载效果
    //ctrl + p
    .displayer(new CircleBitmapDisplayer())
    .build();

  //ctrl + h
  //BitmapDisplayer;
  return displayImageOptions;
 }
}

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

(0)

相关推荐

  • Android通过XListView实现上拉加载下拉刷新功能

    本文实例为大家分享了XListView实现上拉加载下拉刷新的具体代码,供大家参考,具体内容如下 ## 导入XListVIew第三方库文件.通过LinkedList将刷新数据插入到集合头部,将加载的数据放入集合尾部 ## private Context context; private View view; private String path; private XListView xlv; private LinkedList<Data> listData; private Handler

  • Android XListView下拉刷新和上拉加载更多

    市面上有好多的类比ListView刷新数据的开源框架,如:v4包自带的SwipeRefreshLayout ,以及集ListView.GridView甚至WebView于一身的Pulltorefresh等等.前述的两个开源框架目前使用也算频繁.有兴趣的读者可以自行搜索,当然有时间一定回来对所有的使用方式做一个汇总和比较.今天介绍的这款框架,专门针对ListView做下拉刷新与上拉加载的,如果单单是ListView就显得更加简单方便易于理解. 1.首先引入xListView_lib库到自己的Dem

  • MVPXlistView展示上拉下拉效果

    本文实例为大家分享了MVPXlistView上拉下拉展示的具体代码,供大家参考,具体内容如下 抽基类 package com.gs.gg.day8.back; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; public abstract class BackActivity extends AppCompa

  • XListView实现下拉刷新和上拉加载原理解析

    XListview是一个非常受欢迎的下拉刷新控件,但是已经停止维护了.之前写过一篇XListview的使用介绍,用起来非常简单,这两天放假无聊,研究了下XListview的实现原理,学到了很多,今天分享给大家. 提前声明,为了让代码更好的理解,我对代码进行了部分删减和重构,如果大家想看原版代码,请去github自行下载. Xlistview项目主要是三部分:XlistView,XListViewHeader,XListViewFooter,分别是XListView主体.header.footer

  • Android仿XListView支持下拉刷新和上划加载更多的自定义RecyclerView

    首先给大家展示下效果图,感觉还不错,请继续往下阅读: 下拉刷新:        上划加载        在项目更新的过程中,遇到了一个将XListView换成recyclerView的需求,而且更换完之后大体效果不能变,但是对于下拉刷新这样的效果,谷歌给出的解决方案是把RecyclerView放在一个SwipeRefreshLayout中,但是这样其实是拉下一个小圆形控件实现的,和XListView的header效果不同.在网上找了很多的别人代码,都没有实现我想要的效果,于是自己动手写了一个.

  • XListView实现网络加载图片和下拉刷新

    本文实例为大家分享了XListView实现网络加载图片,和下拉刷新的功能,供大家参考,具体内容如下 MainActivity.java public class MainActivity extends AppCompatActivity { private XListView contents; private int page = 0; private MyBaseAdapter adapter; @Override protected void onCreate(Bundle savedI

  • Android RecyclerView 上拉加载更多及下拉刷新功能的实现方法

    RecyclerView 已经出来很久了,但是在项目中之前都使用的是ListView,最近新的项目上了都大量的使用了RecycleView.尤其是瀑布流的下拉刷新,网上吧啦吧啦没有合适的自己总结了一哈. 先贴图上来看看: 使用RecyclerView实现上拉加载更多和下拉刷新的功能我自己有两种方式: 1.使用系统自带的Android.support.v4.widget.SwipeRefreshLayout这个控价来实现. 2.自定义的里面带有RecyleView的控件. 使用RecycleVie

  • Android实现上拉加载更多以及下拉刷新功能(ListView)

    首先为大家介绍Andorid5.0原生下拉刷新简单实现. 先上效果图: 相对于上一个19.1.0版本中的横条效果好看了很多.使用起来也很简单. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" and

  • Android ListView实现上拉加载更多和下拉刷新功能

    本文实例为大家介绍了Android ListView下拉刷新功能的实现方法和功能,供大家参考,具体内容如下 1.ListView优化方式 界面缓存:ViewHolder+convertView 分页加载:上拉刷新 图片缓存 快速滑动ListView禁止刷新 2.效果 3.上拉加载更多原理及实现 当我们手指滑动到listview最后位置的时候,我们触发加载数据的方法.这触发之前我们需要做一些工作,包括: 如何判断滑动到最后? 如何避免重复加载数据? 加载之后如何刷新界面? 1).界面实现AbsLi

  • Android实践之带加载效果的下拉刷新上拉加载更多

    前言 之前写的一个LoadingBar,这次把LoadingBar加到下拉刷新的头部.从头写一个下拉刷新,附赠上拉加载更多.下面话不多说了,来一起看看详细的介绍吧. 效果图: 实现过程 首先是自定义属性,attrs.xml中定义头部的高度和上下的padding. ####attrs.xml#### <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable

  • asp.net+jquery滚动滚动条加载数据的下拉控件

    这样的需求貌似自己感觉不是很合理,因为数据多了如此下拉无论从人还是机器操作都比较痛苦. 没办法由于需求下来了,只能按需求操作.网上找了很多相关控件都感觉有点庞大,占资源比较多.没办法自己花半天时间弄出个半成品自定义控件,拿出来分享下,如有高手看了请多指点. 需求:AJAX滚动滚动条加载数据的下拉列表 控件名称:Webcombo 所用技术:ASP.NET(C#),jQuery,ASP.NET一般处理文件(.ashx) 下拉列表具体实现:用DIV模拟下拉列表,input和图片模拟下拉框.最终结果如下

  • XListView实现多条目网络数据刷新加载 网络加载图片

    本文实例为大家分享了XListView实现刷新加载的具体代码,供大家参考,具体内容如下 MainActivity.java protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pager = findViewById(R.id.viewpager); group = findViewById(

  • Ajax实现列表无限加载和二级下拉选项效果

    Ajax做列表无限加载和Ajax做二级下拉选项,供大家参考,具体内容如下 //栏目Ajax做加载 public function ajaxlist(){ //echo "http://www.域名.com/index.php?a=Index&c=Index&m=ajaxlist"; //echo "<hr>"; $data = Q('sum'); $where = array(); $where['cid'] = 33; $rongyuL

  • Android实现网络加载图片点击大图后浏览可缩放

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 找了一些demo感觉没有自己想要的效果,于是借鉴一些改造一下并记录下来: 1.主Activity public class PictureViewFra extends Activity { private PicGallery gallery; // private ViewGroup tweetLayout; // 弹层 private boolean mTweetShow = false; // 弹层是否

  • Android RecyclerView下拉刷新和上拉加载更多

    今天终于有点时间,来写了一下: 为RecyclerView实现下拉刷新和上拉加载更多.今天会在前面的两篇文章的基础上: RecyclerView系列之(1):为RecyclerView添加Header和Footer RecyclerView系列之(2):为RecyclerView添加分隔线 继续讲述RecyclerView中一些常用组件的实现下拉刷新和上拉加载更多的功能. 在现在的Android手机应用中,几乎每一个APP都有下拉刷新和上拉加载更多的功能,它们的重要性不言而喻. 先不多说,先看效

随机推荐