DataBinding结合RecyclerView动态加载网络数据
来源:互联网 发布:淘宝直播文案怎么写 编辑:程序博客网 时间:2024/06/03 12:48
以前一直是用传统的方式,需要写很多findviewById(),重复代码很多,最近空闲,自己写个小项目练习,也使用了一下DataBinding,发现确实简单很多,现在把过程和经验和大家分享一下。
这是需求界面,我们可以用listview去完成,但是现在介绍的是DataBinding结合RecyclerView去加载。
1.首先,我们需要在buld.gradle中添加依赖,
2.在布局中使用
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data class="com.mymusic.musicplayer.SalesRankData"> //这个是系统自动创建的"隐形"类,我们指定了类名为SalesRankData <variable name="salesBean" //实体类变量名 type="com.mymusic.musicplayer.bean.RankingBean.SalesBean.BooksBeanDes" /> //这里是我们需要绑定的实体类 </data> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="10dp"> <TextView android:id="@+id/tv_item_salesrank_number" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginRight="10sp" android:text="01" android:textColor="@color/main_buttomtext_yellow" android:textSize="14sp" /> <ImageView android:id="@+id/iv_item_salesrank" android:layout_width="50dp" android:layout_height="50dp" android:layout_marginRight="10dp" android:layout_toRightOf="@+id/tv_item_salesrank_number" app:imgurl="@{salesBean.book.cover}" /> //图片加载,使用app:imgurl,imgurl是自己定义的变量 <TextView android:id="@+id/tv_item_salesrank_title" style="@style/tv_standard_12sp" android:layout_alignTop="@+id/iv_item_salesrank" android:layout_toRightOf="@+id/iv_item_salesrank" android:text="@{salesBean.book.title}" /> //绑定实体类里面的值,需要哪一个值就指定到哪层 <TextView android:id="@+id/tv_item_salesrank_description" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/iv_item_salesrank" android:layout_toRightOf="@+id/iv_item_salesrank" android:text="@{salesBean.book.author.title+@string/colon+salesBean.book.author.name+@string/space+salesBean.book.recorder.title+@string/colon+salesBean.book.recorder.name}" android:textColor="@color/gray_hotlists" android:textSize="10sp" /> <View android:layout_width="match_parent" android:layout_height="0.2dp" android:layout_below="@+id/tv_item_salesrank_description" android:layout_marginTop="10dp" android:background="@color/view" /> </RelativeLayout></layout>实体类代码太多,我直接贴hijson的截图,
3.Activity里面做好准备操作
public class SalesRankActivity extends BaseActivity implements IBookRankView { private SalesData salesData;//SalesData就是databinding自动生成的类,我们自己在布局中改成了此类名 private LinearLayoutManager linearLayoutManager; //布局管理器 private List<RankingBean.SalesBean.BooksBeanDes> salesBeen;//这是要加载的List,也就是上面截图里最外层的集合 private SalesRankAdapter salesRankAdapter; private BookRankPersenter bookRankPersenter = new BookRankPersenter(this); @Override void initdatabinding() { salesData = DataBindingUtil.setContentView(this, R.layout.activity_salesrank);//载入布局 } @Override public void initData() { super.initData(); linearLayoutManager = new LinearLayoutManager(this); salesData.rvSalesRank.setLayoutManager(linearLayoutManager);//recyclerview加载布局管理器,不设置方向的话,默认是垂直 salesBeen = new ArrayList<>(); salesRankAdapter = new SalesRankAdapter(salesBeen); salesData.rvSalesRank.setAdapter(salesRankAdapter); bookRankPersenter.getData(); } @Override public void onClick(View view) { } @Override public void setOnclick() { } @Override public void getAllData(RankingBean rankingBean) { salesBeen.clear(); List<RankingBean.SalesBean.BooksBeanDes> books = rankingBean.getSales().getBooks(); salesBeen.addAll(books); salesRankAdapter.notifyDataSetChanged();//这里设置list,adapter刷新和以前的方式都一样 }}
4.Adapter里填充数据
public class SalesRankAdapter extends BaseDatabindingAdapter<RankingBean.SalesBean.BooksBeanDes, SalesRankAdapter.ViewHolder> { public SalesRankAdapter(List<RankingBean.SalesBean.BooksBeanDes> data) { super(data); } @Override Class<SalesRankAdapter.ViewHolder> vhClass() { return ViewHolder.class; } @Override int initLayoutId() { return R.layout.item_salesrank;//item布局 } @Override public void onBindViewHolder(SalesRankAdapter.ViewHolder holder, int position) { RankingBean.SalesBean.BooksBeanDes booksBeanX = data.get(position); holder.databinding.setSalesBean(booksBeanX);//设置好需要的Bean值即可,控件加载数据我们在布局中已经写过了 if (position > 8) {//这里是前面的序号,因为不是从Bean中得到的,所以还是自己写 holder.databinding.tvItemSalesrankNumber.setText(String.valueOf(position + 1)); } else { holder.databinding.tvItemSalesrankNumber.setText("0" + (position + 1)); } } public static class ViewHolder extends RecyclerView.ViewHolder { public ViewHolder(View itemView) { super(itemView); } public SalesRankData databinding; public ViewHolder(ViewDataBinding itemView) { super(itemView.getRoot()); this.databinding = (SalesRankData) itemView;//把ViewDataBinding强转成我们定义的类 } }}我这里写了BaseAdapter,所以和平常的风格有些不一样,但逻辑都是一样的,我把BaseAdpater类贴出来供大家参考
public abstract class BaseAdapter<T, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> { public List<T> data; public BaseAdapter(List<T> data) { this.data = data; } @Override public VH onCreateViewHolder(ViewGroup parent, int viewType) { Class<VH> vhClass = vhClass(); VH tTH = null; Constructor c1 = null; try { c1 = vhClass.getDeclaredConstructor(new Class[]{View.class}); c1.setAccessible(true); View inflate = View.inflate(parent.getContext(), initLayoutId(), null); tTH = (VH) c1.newInstance(inflate); } catch (Exception e) { System.out.println("反射泛型失败"); } return tTH; } abstract Class<VH> vhClass(); abstract int initLayoutId(); @Override public int getItemCount() { if (data == null) return 0; return data.size(); }}
写完adapter效果就能出来了,这里说一下图片加载,我们需要自己去写@BindingAdapter
public class ImagBindingUtils { @BindingAdapter("imgurl") public static void bindingImage(ImageView imageView, String url) { Glide.with(imageView.getContext()).load(url).into(imageView);//用glide加载图片,imgurl在上面的布局里面有使用过 }}最后注意一些小细节,比如文字中需要空格我们在布局中无法直接使用“ ”+,上面有个text值是 @{salesBean.book.author.title+@string/colon+salesBean.book.author.name+@string/space+salesBean.book.recorder.title+@string/colon+salesBean.book.recorder.name}
这里的@string/colon和@string/space分别定义的是冒号和空格,在values的strings里面使用
,其中 是空格符
这篇博客未写到联网请求代码,如不懂的话,可以先去看看我写的"Retrofit2.0的简单实用",http://blog.csdn.net/xkyh941/article/details/78562340,如有问题,可以留言~
阅读全文
0 0
- DataBinding结合RecyclerView动态加载网络数据
- RecyclerView网络加载数据
- Android Databinding 与 RecyclerView 完美结合
- DataBinding动态改变数据
- MVP+Retrofit+RecyclerView实现加载网络数据
- Android Data Binding(结合RecyclerView动态绑定数据)
- RecyclerView和okhttp结合 实现一个网络请求数据
- RecyclerView多条目加载(网络请求数据)
- Android官方DataBinding(三):RecyclerView 使用ViewDataBinding更新数据
- LISTVIEW动态加载网络数据2
- Android+Listview+分页+动态加载网络数据
- Android+Listview+分页+动态加载网络数据
- ListView动态加载网络数据的解决办法
- databinding数据不能进行动态绑定方法
- Glide开源库结合RecyclerView实现加载图片
- Android使用OKHTTP网络框架请求数据,RecyclerView结合Glide展示图片,瀑布流布局样式
- RxJava结合Retrofit使用 自定义封装类结合泛型 请求网络数据+Fresco+RecyclerView+MVP分层
- RecyclerView 和 DataBinding
- springmvc+mybatis+easyui分页
- 获取公众号二维码中的场景值scene_str,scene_id,php开发公众平台场景值
- Hive_应用设计
- Android开发中实用的脚本工具
- HTML5 WebGL 的 3D 仓储管理系统
- DataBinding结合RecyclerView动态加载网络数据
- RxJava2笔记(1)—Hello RxJava
- JAVA_学生管理系统(纯java语言)
- 微信公众号的代码块插入,及一键排版
- Objective-C 中的NSValue的详解
- DCT变换、DCT反变换、分块DCT变换
- java中的静态变量、静态方法与静态代码块区别
- Oulipo
- mysql查看数据库性能常用命令