XrecyclerView实现加载数据和切换不同布局

本文实例为大家分享了XrecyclerView实现加载数据和切换不同布局,供大家参考,具体内容如下

compile 'com.jcodecraeer:xrecyclerview:1.3.2'//XrecyclerView

显示界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
 android:orientation="vertical"
 tools:context="wangxuewei.bwie.com.wangxuewei1510c2071219.MainActivity">

 <RelativeLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:gravity="center_vertical">

  <TextView
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_margin="10dp"
   android:gravity="center"
   android:text="搜索商品" />

  <ImageView
   android:id="@+id/cutImg"
   android:layout_width="30dp"
   android:layout_height="30dp"
   android:layout_alignParentRight="true"
   android:layout_margin="7dp"
   android:src="@drawable/grid_icon" />

 </RelativeLayout>

 <TextView
  android:layout_width="match_parent"
  android:layout_height="2dp"
  android:background="#c0c0c0" />

 <LinearLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_margin="10dp"
  android:orientation="horizontal">

  <EditText
   android:id="@+id/editKey"
   android:layout_width="0dp"
   android:layout_height="wrap_content"
   android:layout_weight="1"
   android:hint="请输入关键字" />

  <Button
   android:id="@+id/btnSearch"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="搜索" />

 </LinearLayout>

 <TextView
  android:layout_width="match_parent"
  android:layout_height="2dp"
  android:background="#c0c0c0" />

 <com.jcodecraeer.xrecyclerview.XRecyclerView
  android:id="@+id/xrecyclerview"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"></com.jcodecraeer.xrecyclerview.XRecyclerView>

</LinearLayout>

网格布局条目显示样式

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:gravity="center"
 android:orientation="vertical">

 <ImageView
  android:id="@+id/GoodsIcon"
  android:layout_width="80dp"
  android:layout_height="80dp" />

 <TextView
  android:id="@+id/title"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_margin="10dp"
  android:text="asdasd" />

 <TextView
  android:id="@+id/price"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="asdasd" />

 <TextView
  android:id="@+id/bargainPrice"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginLeft="5dp"
  android:text="asdasd"
  android:textColor="#f00" />
</LinearLayout>

列表布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:gravity="center_vertical"
 android:orientation="horizontal">

 <ImageView
  android:id="@+id/GoodsIcon"
  android:layout_width="80dp"
  android:layout_height="80dp" />

 <LinearLayout
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:orientation="vertical">

  <TextView
   android:id="@+id/title"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_margin="10dp"
   android:text="asdasd" />

  <LinearLayout
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_margin="10dp"
   android:orientation="horizontal">

   <TextView
    android:id="@+id/price"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="asdasd" />

   <TextView
    android:id="@+id/bargainPrice"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    android:text="asdasd"
    android:textColor="#f00" />
  </LinearLayout>

 </LinearLayout>

</LinearLayout>

主界面

public class MainActivity extends AppCompatActivity implements ShopSearchViewAPI, View.OnClickListener {

 private ImageView cutImg;
 private Button btnSearch;
 private List<GoodsBean.DataBean> list = new ArrayList<>();
 private XRecyclerView xR;
 private EditText editKey;
 private int flag = 1;
 private MyAdapter myAdapter;
 private int i = 1;
 private String string = "手机";
 private String name;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  //加载控件
  initView();
  getData("手机", "1");

  //设置可上拉
  xR.setPullRefreshEnabled(true);
  xR.setLoadingMoreEnabled(true);
  //设置上拉下拉样式
  xR.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);
  xR.setLaodingMoreProgressStyle(ProgressStyle.BallClipRotate);

  clickListener();

  xR.setLoadingListener(new XRecyclerView.LoadingListener() {
   @Override
   public void onRefresh() {
    i = 1;
    list.clear();
    getData(string, "" + i);
    xR.refreshComplete();
   }

   @Override
   public void onLoadMore() {
    i++;
    getData(string, "" + i);
    xR.loadMoreComplete();
   }
  });

 }

 public void getData(String key, String page) {
  ShopSearchPresenter shopSearchPresenter = new ShopSearchPresenter(this, this);
  shopSearchPresenter.getGoodsData("http://120.27.23.105/product/searchProducts", key, page);
 }

 private void clickListener() {
  cutImg.setOnClickListener(this);
  btnSearch.setOnClickListener(this);
 }

 private void initView() {
  cutImg = (ImageView) findViewById(R.id.cutImg);
  btnSearch = (Button) findViewById(R.id.btnSearch);
  xR = (XRecyclerView) findViewById(R.id.xrecyclerview);
  editKey = (EditText) findViewById(R.id.editKey);
 }

 @Override
 public void getSuccess(Object o) {
  GoodsBean o1 = (GoodsBean) o;
  List<GoodsBean.DataBean> data = o1.getData();
  list.addAll(data);
  setMyAdapter(flag);
 }

 @Override
 public void getFailed(Exception e) {

 }

 @Override
 public void onClick(View v) {
  switch (v.getId()) {
   case R.id.cutImg:
    if (flag == 1) {
     cutImg.setImageResource(R.drawable.lv_icon);
     flag = 2;
    } else {
     cutImg.setImageResource(R.drawable.grid_icon);
     flag = 1;
    }
    setMyAdapter(flag);
    break;
   case R.id.btnSearch:
    list.clear();
    name = editKey.getText().toString();
    string = name;
    getData(string, "1");
    break;
  }
 }

 public void setMyAdapter(int f) {
  if (f == 1) {
   // 线性布局管理器 VERTICAL默认样式/竖向显示  第三个参数是数据是否到过来显示
   LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
   //添加布局管理器
   xR.setLayoutManager(manager);
   myAdapter = new MyAdapter(list, this, f);
   xR.setAdapter(myAdapter);
  } else if (f == 2) {
   // 线性布局管理器 VERTICAL默认样式/竖向显示  第三个参数是数据是否到过来显示
   GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2, GridLayoutManager.VERTICAL, false);
   //添加布局管理器
   xR.setLayoutManager(gridLayoutManager);
   myAdapter = new MyAdapter(list, this, f);
   xR.setAdapter(myAdapter);
  }
 }
}

MyAdapter

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
 private List<GoodsBean.DataBean> list;
 private Context context;
 private int flag = 1;
 private View inflate;

 public MyAdapter(List<GoodsBean.DataBean> list, Context context, int flag) {
  this.list = list;
  this.context = context;
  this.flag = flag;
 }

 @Override
 public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  if (flag == 1) {
   inflate = LayoutInflater.from(context).inflate(R.layout.lvitem, parent, false);
  } else if (flag == 2) {
   inflate = LayoutInflater.from(context).inflate(R.layout.griditem, parent, false);
  }

  MyViewHolder myViewHolder = new MyViewHolder(inflate);

  return myViewHolder;
 }

 @Override
 public void onBindViewHolder(MyAdapter.MyViewHolder holder, int position) {

  String images = list.get(position).getImages();
  String[] split = images.split("\\|");
  Glide.with(context).load(split[0]).into(holder.icon);
  holder.title.setText(list.get(position).getTitle());
  holder.bargainPrice.setText("折扣价:" + list.get(position).getBargainPrice() + "");
  holder.price.setText("原价:" + list.get(position).getPrice());
  holder.price.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);

 }

 @Override
 public int getItemCount() {
  return list != null ? list.size() : 0;
 }

 class MyViewHolder extends RecyclerView.ViewHolder {

  private ImageView icon;
  private TextView title;
  private TextView bargainPrice;
  private TextView price;

  public MyViewHolder(View itemView) {
   super(itemView);

   icon = (ImageView) itemView.findViewById(R.id.GoodsIcon);
   title = (TextView) itemView.findViewById(R.id.title);
   bargainPrice = (TextView) itemView.findViewById(R.id.bargainPrice);
   price = (TextView) itemView.findViewById(R.id.price);

  }
 }

}

ShopSearchModle

public class ShopSearchModle {

 public void getData(String url, Map<String, String> map, final ShopSearchPresenterAPI shopSearchPresenterAPI) {
  HttpUtils.getInstance().get(url, map, new CallBack() {
   @Override
   public void onSuccess(Object o) {
    shopSearchPresenterAPI.success(o);
   }

   @Override
   public void onFailed(Exception e) {
    shopSearchPresenterAPI.failed(e);
   }
  }, GoodsBean.class);
 }

}

ShopSearchPresenter

public class ShopSearchPresenter {

 private ShopSearchViewAPI shopSearchViewAPI;
 private Context context;
 private final ShopSearchModle shopSearchModle;

 public ShopSearchPresenter(ShopSearchViewAPI shopSearchViewAPI, Context context) {
  this.shopSearchViewAPI = shopSearchViewAPI;
  this.context = context;
  shopSearchModle = new ShopSearchModle();
 }

 public void getGoodsData(String url, String keywords, String page) {
  Map<String, String> map = new HashMap<>();
  map.put("keywords", keywords);
  map.put("page", page);
  shopSearchModle.getData(url, map, new ShopSearchPresenterAPI() {
   @Override
   public void success(Object o) {
    shopSearchViewAPI.getSuccess(o);
   }

   @Override
   public void failed(Exception e) {
    shopSearchViewAPI.getFailed(e);
   }
  });
 }

}

ShopSearchPresenterAPI

public interface ShopSearchPresenterAPI {

 void success(Object o);

 void failed(Exception e);

}

重点内容

package wangxuewei.bwie.com.wangxuewei1510c2071219;

/**
 * Created by jim on 2017/12/19.
 */

public interface ShopSearchViewAPI {

 void getSuccess(Object o);

 void getFailed(Exception e);

}

HttpUtils

public class HttpUtils {

 private static volatile HttpUtils instance;

 private static Handler handler = new Handler();

 private HttpUtils() {

 }

 public static HttpUtils getInstance() {
  if (instance == null) {
   synchronized (HttpUtils.class) {
    if (instance == null) {
     instance = new HttpUtils();
    }
   }
  }
  return instance;
 }

 //get请求
 public void get(String url, Map<String, String> map, final CallBack callBack, final Class c) {
  //对url和参数做拼接处理
  StringBuffer stringBuffer = new StringBuffer();
  stringBuffer.append(url);
  //判断是否存在? if中是存在
  if (stringBuffer.indexOf("?") != -1) {
   //判断?是否在最后一位 if中是不在最后一位
   if (stringBuffer.indexOf("?") != stringBuffer.length() - 1) {
    stringBuffer.append("&");
   }
  } else {
   stringBuffer.append("?");
  }
  for (Map.Entry<String, String> entry : map.entrySet()) {
   stringBuffer.append(entry.getKey())
     .append("=")
     .append(entry.getValue())
     .append("&");
  }
  //判断是否存在& if中是存在
  if (stringBuffer.indexOf("&") != -1) {
   stringBuffer.deleteCharAt(stringBuffer.lastIndexOf("&"));
  }

  //1:创建OkHttpClient对象
  OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Logger()).build();
  //2:创建Request对象
  final Request request = new Request.Builder()
    .get()
    .url(stringBuffer.toString())
    .build();
  //3:创建Call对象
  Call call = okHttpClient.newCall(request);
  //4:请求网络
  call.enqueue(new Callback() {
   //请求失败
   @Override
   public void onFailure(Call call, final IOException e) {
    handler.post(new Runnable() {
     @Override
     public void run() {
      callBack.onFailed(e);
     }
    });
   }

   //请求成功
   @Override
   public void onResponse(Call call, Response response) throws IOException {
    String result = response.body().string();
    //拿到数据解析
    final Object o = new Gson().fromJson(result, c);
    //当前是在子线程,回到主线程中
    handler.post(new Runnable() {
     @Override
     public void run() {
      //回调
      callBack.onSuccess(o);
     }
    });
   }
  });

 }

 //post请求
 public void post(String url, Map<String, String> map, final CallBack callBack, final Class c) {
  //1:创建OkHttpClient对象
  OkHttpClient okHttpClient = new OkHttpClient();
  //2:提供post请求需要的body对象
  FormBody.Builder builder = new FormBody.Builder();
  for (Map.Entry<String, String> entry : map.entrySet()) {
   builder.add(entry.getKey(), entry.getValue());
  }
  FormBody body = builder.build();
  //3:创建Request对象
  final Request request = new Request.Builder()
    .post(body)
    .url(url)
    .build();
  //4:创建Call对象
  Call call = okHttpClient.newCall(request);
  //5:请求网络
  call.enqueue(new Callback() {
   //请求失败
   @Override
   public void onFailure(Call call, final IOException e) {
    handler.post(new Runnable() {
     @Override
     public void run() {
      callBack.onFailed(e);
     }
    });
   }

   //请求成功
   @Override
   public void onResponse(Call call, Response response) throws IOException {
    String result = response.body().string();
    //拿到数据解析
    final Object o = new Gson().fromJson(result, c);
    //当前是在子线程,回到主线程中
    handler.post(new Runnable() {
     @Override
     public void run() {
      //回调
      callBack.onSuccess(o);
     }
    });
   }
  });
 }

}

重点内容

public interface CallBack {

 void onSuccess(Object o);

 void onFailed(Exception e);

}

Logger

public class Logger implements Interceptor {
 @Override
 public Response intercept(Chain chain) throws IOException {
  Request original = chain.request();
  HttpUrl url = original.url().newBuilder()
    .addQueryParameter("source", "android")
    .build();
  //添加请求头
  Request request = original.newBuilder()
    .url(url)
    .build();
  return chain.proceed(request);
 }
}

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

(0)

相关推荐

  • Android XRecyclerView实现多条目加载

    本文实例为大家分享了Android实现多条目加载展示的具体代码,供大家参考,具体内容如下 展示效果 这里写图片描述 依赖 testCompile 'junit:junit:4.12' compile 'com.hjm:BottomTabBar:1.1.1' compile 'com.android.support:design:23.4.0' compile 'com.android.support:mediarouter-v7:25.0.0' compile 'com.android.supp

  • XRecyclerView实现下拉刷新、滚动到底部加载更多等功能

    介绍: 一个实现了下拉刷新,滚动到底部加载更多以及添加header功能的的RecyclerView.使用方式和RecyclerView完全一致,不需要额外的layout,不需要写特殊的adater. 加载效果内置了AVLoadingIndicatorView上的所有效果,可以根据需要指定. 项目地址:https://github.com/jianghejie/XRecyclerView 效果: 使用: xml <RelativeLayout xmlns:android="http://sc

  • XrecyclerView实现加载数据和切换不同布局

    本文实例为大家分享了XrecyclerView实现加载数据和切换不同布局,供大家参考,具体内容如下 compile 'com.jcodecraeer:xrecyclerview:1.3.2'//XrecyclerView 显示界面 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/an

  • JS简单实现滑动加载数据的方法示例

    本文实例讲述了JS简单实现滑动加载数据的方法.分享给大家供大家参考,具体如下: //滑动 function getScrollTop() { var scrollTop = 0; if (document.documentElement && document.documentElement.scrollTop) { scrollTop = document.documentElement.scrollTop; }else if (document.body) { scrollTop =

  • Android之ListView分页加载数据功能实现代码

    什么是ListView分页加载数据功能呢?在现在的大数据时代,我们不可能把某些数据全部展示到界面,好比我们经常会看的QQ空间一样,当你看动态的时候,系统不可能会把所有好友的动态都展示在上面,你能看到的一般都是最新好友更新的动态,假如你要看非最新的好友动态,通常你都会手指向上滑动屏幕然后去查看,当界面下滑到一定数量的时候,就会看到一个"查看更多",然后突然停顿一下,系统会通过网络去给你刷新其他动态信息,这样的功能我们一般叫做数据下拉刷新功能,也就是我们的分页加载功能,具体的实现是怎样的呢

  • Android实现加载状态视图切换效果

    关于Android加载状态视图切换,具体内容如下 1.关于Android界面切换状态的介绍 怎样切换界面状态?有些界面想定制自定义状态?状态如何添加点击事件?下面就为解决这些问题! 内容界面 加载数据中 加载数据错误 加载后没有数据 没有网络 2.思路转变,抽取分离类管理几种状态 以前做法: 直接把这些界面include到main界面中,然后动态去切换界面,后来发现这样处理不容易复用到其他项目中,而且在activity中处理这些状态的显示和隐藏比较乱 利用子类继承父类特性,在父类中写切换状态,但

  • vue移动UI框架滑动加载数据的方法

    前言 在我们移动端还有一个很常用的组件,那就是滑动加载更多组件.平常我们看到的很多插件实现相当复杂就觉得这个组件很难,其实不是的!!这个组件其实可以很简单的就实现出来,而且体验也能非常的棒(当然我们没有实现下拉刷新功能)!!下面我们就一起来实现这个组件. 效果展示 先上一个gif图片展示我们做成后的效果,如下: DOM结构 页面应该包含三个部分:1. 正文区域 2.加载小菊花以及记载文字 3.所有数据加载完成后的文字: <div ref="scroll" class="

  • CI映射(加载)数据到view层的方法

    本文实例讲述了CI映射(加载)数据到view层的方法.分享给大家供大家参考,具体如下: CI有个恶心的东西,就是需要把所有的数据都要放到$data数组中才能映射到view层,如: 当前我从数据库的link表(友情链接表,字段:id  name   url),搜索出来的数据方式: $query = $this->db->query("select id,name,url from cg_link where 1"); $links = $query->result();

  • PHP+jQuery实现滚屏无刷新动态加载数据功能详解

    本文实例讲述了PHP+jQuery实现滚屏无刷新动态加载数据功能.分享给大家供大家参考,具体如下: index.php <?php require_once('connect.php'); //连接数据库 $user = array('demo1','demo2','demo3','demo3','<de></de>mo4'); //模拟了几个用户 ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans

  • 拉动滚动条加载数据的jquery代码

    复制代码 代码如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>拉动滚动条加载数据</title> <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> &l

  • asp.net网站开发中用jquery实现滚动浏览器滚动条加载数据(类似于腾讯微博)

    自从腾讯微博上线以来,基本上就开始用了,一直到现在,作为一个开发人员,也看到了腾讯微博一直在不停的改变,也不知道大家有没有发现,腾讯微博提供两种加载数据的方式,一种是分页,一种是滚动浏览器滚动条加载数据,分页功能我想大家都做得太多了,今天我与大家分享一下我用滚动条滚动加载数据下面开讲: 首先说一下思路,我用的是Jquery,然后通过Jquery的ajax()方法通过 HTTP 请求加载远程数据来实现的,用到Jquery,首先要应用jquery.min.js类库,如果本地没有,也可以直接引用下面地

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

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

随机推荐