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

本文实例为大家分享了XListView实现刷新加载的具体代码,供大家参考,具体内容如下

MainActivity.java

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

 pager = findViewById(R.id.viewpager);
 group = findViewById(R.id.group);

 li = new ArrayList<>();
 li.add(new Afragment());
 li.add(new Bfragment());
 li.add(new Cfragment());
 li.add(new Dfragment());

 pager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
  @Override
  public Fragment getItem(int position) {
  return li.get(position);
  }

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

 group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
  @Override
  public void onCheckedChanged(RadioGroup radioGroup, int i) {

  switch (i){
   case R.id.r1:
   pager.setCurrentItem(0);
   break;
   case R.id.r2:
   pager.setCurrentItem(1);
   break;
   case R.id.r3:
   pager.setCurrentItem(2);
   break;
   case R.id.r4:
   pager.setCurrentItem(3);
   break;
  }
  }
 });

 }

activity_main.xml

 <?xml version="1.0" encoding="utf-8"?>
 <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context=".ui.MainActivity">
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 >
 <android.support.v4.view.ViewPager
  android:id="@+id/viewpager"
  android:layout_width="match_parent"
  android:layout_height="0dp"
  android:layout_weight="9"
  >

 </android.support.v4.view.ViewPager>

 <RadioGroup
  android:id="@+id/group"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_weight="1"
  android:orientation="horizontal"
  >
  <RadioButton
  android:id="@+id/r1"
  android:layout_width="wrap_content"
  android:layout_height="match_parent"
  android:button="@null"
  android:gravity="center"
  android:layout_weight="1"
  android:text="Afrag"/>
  <RadioButton
  android:id="@+id/r2"
  android:layout_width="wrap_content"
  android:layout_height="match_parent"
  android:button="@null"
  android:gravity="center"
  android:layout_weight="1"
  android:text="Bfrag"/>
  <RadioButton
  android:id="@+id/r3"
  android:layout_width="wrap_content"
  android:layout_height="match_parent"
  android:button="@null"
  android:gravity="center"
  android:layout_weight="1"
  android:text="Cfrag"/>
  <RadioButton
  android:id="@+id/r4"
  android:layout_width="wrap_content"
  android:layout_height="match_parent"
  android:button="@null"
  android:gravity="center"
  android:layout_weight="1"
  android:text="Dfrag"/>

 </RadioGroup>

 </LinearLayout>

</android.support.constraint.ConstraintLayout>

Afragment.java

public class Afragment extends Fragment{
 private int page=1;
 private XListView listView;
 private MyBaseAdapter adapter;
 ResponseBean responseBean;

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

  listView = view.findViewById(R.id.xlv);
  adapter = new MyBaseAdapter(getLayoutInflater());
  listView.setAdapter(adapter);

  listView.setPullLoadEnable(true);
  listView.setXListViewListener(new XListView.IXListViewListener() {
  @Override
  public void onRefresh() {
   page=0;
   loadData(page);
  }

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

  }
  });
  loadData(page);
  return view;
 }

 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 urlString=url+page;
  new AsyncTask<String,Void,List<DataItem>>(){

  @Override
  protected List<DataItem> doInBackground(String... strings) {
   try {
   URL url = new URL(strings[0]);
   HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
   urlConnection.setRequestMethod("GET");
   urlConnection.setReadTimeout(5000);
   urlConnection.setConnectTimeout(5000);
   int responseCode = urlConnection.getResponseCode();
   if (responseCode==200){
    String result=String2(urlConnection.getInputStream());
    responseBean = new Gson().fromJson(result, 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) {
   super.onPostExecute(dataItems);
   if (dataItems == null) {
   Toast.makeText(getActivity(), "请求数据错误", Toast.LENGTH_LONG).show();
   return;
   }
   updateData(dataItems);
   loadCompleted();

  }
  }.execute(urlString);
 }

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

  }

 }

 private void loadCompleted(){
  page++;
  listView.stopRefresh();
  listView.stopLoadMore();
 }

 private String String2(InputStream stream){
  StringBuilder sb = new StringBuilder();
  BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
  try {
  for (String tmp=reader.readLine();tmp!=null;tmp=reader.readLine()){
   sb.append(tmp);
  }
  } catch (IOException e) {
  e.printStackTrace();
  }
  return sb.toString();
 }
 }

MyBaseAdapter.java

public class MyBaseAdapter extends BaseAdapter{

 private List<DataItem> datas;
 private LayoutInflater layoutInflater;

 public MyBaseAdapter(LayoutInflater layoutInflater) {
 this.layoutInflater = layoutInflater;
 datas=new ArrayList<>();
 }

 public void setDatas(List<DataItem> datas) {
 datas.clear();
 if (datas!=null){
  datas.addAll(datas);
 }
 notifyDataSetChanged();
 }

 public void addDatas(List<DataItem> dataItems) {
 if (dataItems!=null){
  datas.addAll(dataItems);
  notifyDataSetChanged();
 }

 }

 public final int VIEW_TYPE_COUNT=2;
 public final int IMAGE_TEXT_TYPE=0;
 public final int TEXT_TYPE=1;
 @Override
 public int getItemViewType(int position) {
 if (position % 2==0){
  return IMAGE_TEXT_TYPE;
 }else {
  return TEXT_TYPE;
 }

 }

 @Override
 public int getViewTypeCount() {
 return VIEW_TYPE_COUNT;
 }

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

 @Override
 public Object getItem(int i) {
 return datas.get(i);
 }

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

 @Override
 public View getView(int i, View view, ViewGroup viewGroup) {

 if (getItemViewType(i)==IMAGE_TEXT_TYPE){
  ViewHolder viewHolder=null;
  if (view==null){
  view = layoutInflater.inflate(R.layout.item, viewGroup,false);
  viewHolder = new ViewHolder(view);

  }else {
  viewHolder = (ViewHolder) view.getTag();
  }
  viewHolder.bindData((DataItem) getItem(i));
 }else {
  ViewHolder2 viewHolder2;
  if (view==null){
  view = layoutInflater.inflate(R.layout.item_text, viewGroup, false);
  viewHolder2 = new ViewHolder2();
  viewHolder2.textView = view.findViewById(R.id.text);
  view.setTag(viewHolder2);
  }else {
  viewHolder2 = (ViewHolder2) view.getTag();
  }

  viewHolder2.textView.setText(datas.get(i).getTitle());
 }

 return view;
 }

 public class ViewHolder{
 private ImageView icon;
 private TextView title;
 private TextView date;

 public ViewHolder(View view) {
  icon = view.findViewById(R.id.icon);
  title = view.findViewById(R.id.title);
  date = view.findViewById(R.id.date);

  view.setTag(this);
 }

 public void bindData(DataItem item) {
  title.setText(item.getTitle());
  date.setText(item.getId());

  ImageLoader.getInstance().displayImage(item.getFirst(),icon
   , ImageloaderConfigs.getDefult(icon.getContext()));
 }
 }

 public class ViewHolder2{
 TextView textView;

 }

}

ImageLoaderConfigs.java

public class ImageloaderConfigs {
 public static ImageLoaderConfiguration getImageLoader(Context context){
 ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)
  .memoryCacheSizePercentage(13)
  .diskCacheSize(50*1024*1024)
  .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
  .writeDebugLogs()
  .build();
 return configuration;
 }

 public static DisplayImageOptions getDefult(Context context){
 DisplayImageOptions imageOptions = new DisplayImageOptions.Builder()
  .cacheInMemory(true)
  .cacheOnDisk(true)
  .bitmapConfig(Bitmap.Config.RGB_565)
  .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
  .displayer(new CircleBitmapDisplayer())
  .build();
 return imageOptions;
 }

}

App.java

public class App extends Application{
 @Override
 public void onCreate() {
 super.onCreate();
 ImageLoader.getInstance().init(ImageloaderConfigs.getImageLoader(this));
 }
}

ResponsBean.java

public class ResponseBean {
 private int resultcode;
 private String reason;
 private Result result;

 public int getResultcode() {
 return resultcode;
 }

 public String getReason() {
 return reason;
 }

 public Result getResult() {
 return result;
 }

 public class Result{
 private List<DataItem> data;

 public List<DataItem> getData() {
  return data;
 }
 }
}

DataItem.java

public class DataItem {
 private String id;
 private String title;
 private List<String> albums;

 public String getId() {
 return id;
 }

 public String getTitle() {
 return title;
 }

 public List<String> getAlbums() {
 return albums;
 }
 public String getFirst(){
 return albums==null || albums.size()==0? "" : albums.get(0);
 }

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

(0)

相关推荐

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

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

  • 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支持下拉刷新和上划加载更多的自定义RecyclerView

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

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

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

  • 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

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

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

  • Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数

    背景 笔者之前一直使用 bootstrap table ,因为当前项目中主要使用 Layui 框架,于是也就随了 Layui table ,只是在使用的时候出现了一些问题,当然也是怪自己不熟悉的锅吧! 出现的问题: 1.使用 Layui 官方提供的 [转换静态表格] 方式初始化加载时报 id 找不到的错误(自己的锅) 2.传递参数问题(姑且算是 Layui 官方的锅) 笔者使用的 table 加载刷新方案 有一个页面,左侧是一个 tree,右侧是一个 table,默认 table 加载全数据,当

  • iOS开发使用JSON解析网络数据

    前言:对服务器请求之后,返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) 本篇随便先讲解JSON解析. 正文: 关于JSON: JSON是一种轻量级的数据格式,一般用于数据交互JSON的格式很像Objective-C中的字典和数组:{"name":"jack","age":10} 补充: 标准的JSON格式的注意点:key必须用双引号.(但是在Java中是单引号) JSON-OC的转换对照表 其中:null--返回OC里的N

  • 微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析

    本文实例讲述了微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法.分享给大家供大家参考,具体如下: 微信小程序为2017年1月9日打下了一个特殊的标签,迅速刷爆了网络和朋友圈,最近我也写了一个demo程序体验一把.微信小程序和vuejs有些像,都是数据驱动视图&单向数据绑定,而其体验要比H5页面好很多,这得益于微信环境的支持以及首次运行时同时加载所有页面的处理.本文将分享微信小程序列表的下拉刷新和上划加载的实践. 效果图 首先来看看程序效果图,以下四张图从左至右依次是:下来刷新动画.下拉刷

  • 网络程序员伴侣Lshdic--脚本加解密器

    功能比较强大的一款加密器,包括加密前后的测试与常规字符统计,加密方式包括js和vbs,可以选择使用 以下为源码,复制保存为.htm格式即可使用 网络程序员伴侣Lshdic--脚本加解密器 dim vbsstr,vbstr sub forstr if js1.disabled=false then vbstr=txt1.value vbsstr=strreverse(vbstr) end if end sub function chicks(where){ jsstr=String.fromCha

  • 详解iOS开发中UItableview控件的数据刷新功能的实现

    实现UItableview控件数据刷新 一.项目文件结构和plist文件 二.实现效果 1.说明:这是一个英雄展示界面,点击选中行,可以修改改行英雄的名称(完成数据刷新的操作). 运行界面: 点击选中行: 修改数据后自动刷新: 三.代码示例 数据模型部分: YYheros.h文件 复制代码 代码如下: // //  YYheros.h //  10-英雄展示(数据刷新) // //  Created by apple on 14-5-29. //  Copyright (c) 2014年 itc

  • Android ListView下拉刷新上拉自动加载更多DEMO示例

    代码下载地址已经更新.因为代码很久没更新,已经很落伍了,建议大家使用RecyclerView实现. 参考项目: https://github.com/bingoogolapple/BGARefreshLayout-Android https://github.com/baoyongzhang/android-PullRefreshLayout 下拉刷新,Android中非常普遍的功能.为了方便便重写的ListView来实现下拉刷新,同时添加了上拉自动加载更多的功能.设计最初是参考开源中国的And

  • Ionic如何实现下拉刷新与上拉加载功能

    IONIC 是目前最有潜力的一款 HTML5 手机应用开发框架.通过 SASS 构建应用程序,它提供了很多 UI 组件来帮助开发者开发强大的应用. 它使用 JavaScript MVVM 框架和 AngularJS 来增强应用.提供数据的双向绑定,使用它成为 Web 和移动开发者的共同选择.Ionic是一个专注于用WEB开发技术,基于HTML5创建类似于手机平台原生应用的一个开发框架.Ionic框架的目的是从web的角度开发手机应用,基于PhoneGap的编译平台,可以实现编译成各个平台的应用程

  • JS 插件dropload下拉刷新、上拉加载使用小结

    前端展示php代码: <?php header("Content-type: text/html; charset=utf-8"); include_once("./config.php"); // 初始显示界面数据获取 $data = file_get_contents(URL."/interfaces/page.php?paging=1"); // echo $data;die; $data = json_decode($data);

  • Android中Volley框架进行请求网络数据的使用

    问题的阐述:Android SDK中的HttpClient和HttpUrlConnection两种请求方式用来处理网络的复杂的操作,但当应用比较复杂的时候需要我们编写大量的代码处理很多东西:图像缓存,请求的调度等等: 解决:Volley就是为解决这些而生,它与2013年Google I/O大会上被提出:使得Android应用网络操作更方便更快捷:抽象了底层Http Client等实现的细节,让开发者更专注与产生RESTful Request.另外,Volley在不同的线程上异步执行所有请求而避免

随机推荐