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)