RecyclerView通用适配器
在Android开发中使用列表呈现数据的情况很多,现在我们常用RecyclerView呈现列表,为了开发敏捷和代码优雅,我们现在来打造<?xml version="1.0" encoding="utf-8"?>
本文使用 dataBinding 数据绑定,不会的小伙自己去学习下吧
一、dataBinding配置,在build.gradle添加dataBinding配置,如下图所示

二、CommAdapter代码如下:
package com.rx.baseadapter; import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; import java.util.List; /**
* author:puxiaobo
* email:ggband520@163.com
* date:2017/11/20
* desc: RecyclerView 公用Adapter;
*/ public abstract class CommAdapter<T> extends RecyclerView.Adapter<CommAdapter.ViewHolder> { private int brId;//databinding 实体ID 在布局文件定义
private List<T> datas;
private int itemRes;//itemView 布局文件
private OnItemClickListener listener;
private ViewDataBinding viewDataBinding; /**
*
* @param datas 数据
* @param brId 实体ID 在布局文件定义
* @param itemRes item布局资源ID
*/
protected CommAdapter(List<T> datas, int brId, int itemRes) {
this.datas = datas;
this.brId = brId;
this.itemRes = itemRes;
} @Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
viewDataBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), itemRes, parent, false);
ViewHolder viewHolder = new ViewHolder(viewDataBinding.getRoot());
viewHolder.setViewDataBinding(viewDataBinding);
return viewHolder;
} @Override
public void onBindViewHolder(CommAdapter.ViewHolder holder, int position) {
if (brId != -1)
holder.getViewDataBinding().setVariable(brId, datas.get(position));
bindViewItemData(holder.getViewDataBinding(), position, datas.get(position), holder);
} @Override
public int getItemCount() {
return datas == null ? 0 : datas.size();
} protected class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private ViewDataBinding viewDataBinding; public void setViewDataBinding(ViewDataBinding viewDataBinding) {
this.viewDataBinding = viewDataBinding;
} public ViewDataBinding getViewDataBinding() {
return viewDataBinding;
} public ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
viewDataBinding = (ViewDataBinding) itemView.getTag(); } @Override
public void onClick(View v) {
if (listener != null)
listener.onItemClick(v, getLayoutPosition());
}
} public void setDatas(List<T> datas) {
this.datas = datas; } public void setOnItemClickListener( OnItemClickListener onItemClickListener) {
this.listener = onItemClickListener;
} public abstract void bindViewItemData(ViewDataBinding binding, int position, T t, ViewHolder holder); /**
* item点击事件
*/
public interface OnItemClickListener {
void onItemClick(View item, long position);
}
}
三、item布局文件view_fine_balance_item.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="monRecord"
type="com.rx.baseadapter.MonRecord" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white">
<ImageView
android:id="@+id/im_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="8dip"
android:layout_marginTop="8dip"
android:src="@mipmap/ic_launcher" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/im_icon"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="10dip">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="8dip"
android:orientation="horizontal">
<TextView
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@{monRecord.title}"
android:textSize="17sp" />
<TextView
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end"
android:text="@{monRecord.createdate}"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</layout>
四、测试布局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="com.rx.baseadapter.MainActivity"> <android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </RelativeLayout>
五、使用 CommAdapter MainActivity
package com.rx.baseadapter; import android.databinding.ViewDataBinding;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private List<MonRecord> monRecords; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init(); } private void init() {
recyclerView = findViewById(R.id.rv);
initData();
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new CommAdapter<MonRecord>(monRecords, BR.monRecord, R.layout.view_fine_balance_item) { @Override
public void bindViewItemData(ViewDataBinding binding, int position, MonRecord monRecord, CommAdapter.ViewHolder holder) {
/**
* 这里可以扩展需求 (绑定数据)
*/ // ViewFineBalanceItemBinding itemBinding = (ViewFineBalanceItemBinding)binding;
// itemBinding.imIcon.setImageResource(R.mipmap.ic_launcher); }
}); } private void initData() { monRecords = new ArrayList<>(); MonRecord monRecord = null; for (int i = 0; i < 20; i++) {
monRecord = new MonRecord();
monRecord.setBalance(25.4f);
monRecord.setCreatedate("2017-08-09 08:34:55");
monRecord.setPaymoney(32.76f);
monRecord.setTitle("消费提示");
monRecords.add(monRecord);
} } } 六、效果图
RecyclerView通用适配器的更多相关文章
- RecyclerView的通用适配器,和滚动时不加载图片的封装
对于RecyclerView我们需要使用RecyclerAdapter,使用方式与ListViewAdapter类似,具体代码大家可以在网上搜索,这里就只教大家使用封装后的简洁RecyclerAdap ...
- RecyclerView的通用适配器
本来这一个主题应该早就写了,只是项目多,属于自己的时间不多,所以现在才开动!! 前一段时间写了一篇文章,是关于ListView,GriView万能适配器,没有看过的同学,可以先看看那篇文章,然后在来学 ...
- listview-android:打造万能通用适配器(转)
转载:https://blog.csdn.net/q649381130/article/details/51781921: 1.前言 listview作为安卓项目中一个的明星控件,它的适配器的写法是广 ...
- ListView ,GridView 通用适配器
前言 接近半年的时间没有写博客了,今年公司的项目有点多,比较忙,没时间写,这是其一.其次是,这半年来,有时间的时候,我都会看看自己以前写的博客,也许是以前刚刚写博客,经验不足,感觉写出来的博客质量很不 ...
- Android教你怎样一步步打造通用适配器
前言 在Android开发中ListView是最为经常使用的控件之中的一个,基本每一个应用都会涉及到它,要使用ListView列表展示,就不可避免地涉及到另外一个东西--Adapter,我们都知道,A ...
- Android开发进阶 -- 通用适配器 CommonAdapter
在Android开发中,我们经常会用到ListView 这个组件,为了将ListView 的内容展示出来,我们会去实现一个Adapter来适配,将Layout中的布局以列表的形式展现到组件中. ...
- RecyclerView 通用 Adapter
先看使用方法
- 似曾相识的 RecyclerView
一.常用方法 RecyclerView 与 ListView.GridView 类似,都是可以显示同一种类型 View 的集合的控件. 首先看看最简单的用法,四步走: ①接入 build.gradle ...
- RecyclerView全面解析
写在前面 起深入浅出这名字的时候我是慎重又慎重的,生怕被人骂标题党,写的什么破玩意还敢说深入浅出.所以还是请大家不要抱着太高的期望,因为没有期望就没有失望,就像陈润说的,超预期嘛.全当看小说的心情来看 ...
随机推荐
- linux在线中文手册
linux在线中文手册 http://linux.51yip.com/ 百度中的百度应用也不错 http://www.baidu.com/s?word=linux%E5%91%BD%E4%BB%A4& ...
- HTTP协议之chunk介绍
http chunked 当客户端向服务器请求一个静态页面或者一张图片时,服务器可以很清楚的知道内容大小,然后通过Content-Length消息首部字段告诉客户端需要接收多少数据.但是如果是动态页面 ...
- Python关于self用法重点分析
在介绍Python的self用法之前,先来介绍下Python中的类和实例…… 我们知道,面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板,比如学生这个抽象的事物,可以 ...
- DEVC怎么建工程
1.DEVC建工程 1.1 新建项目 打开文件,选择新建-->项目-->ConsoleApplication(控制台程序),输入项目名,选择保存路径.(单独建一个文件夹存放) 项目建成功后 ...
- CSS 鼠标选中文字后改变背景色的实现代码
废话不多说,直接上代码 ::-moz-selection{background:#93C; color:#FCF;} ::selection {background:#93C; color:#FCF; ...
- What does "exceeded limit of maxWarmingSearchers=X" mean?
Whenever a commit happens in Solr, a new "searcher" (with new caches) is opened, "war ...
- springboot springcloud 热部署
本文转载自:https://www.cnblogs.com/moly/p/7978303.html 可以在配置修改某些文件重启,建议配置一个控制文件,只有此文件修改才会重启. 1. pom中添加: & ...
- 使用RetionalRose根据现有的java工程逆向生成类图
1.进入RetionalRose选择J2EE模板 2.在菜单栏选择tools->java/j2EE->reverse engineer 3.编辑路径Edit CLASSPATH选择要生成类 ...
- ==和is
is是比较两个引用是否指向了同一个对象(引用比较) ==是比较两个对象是否相等 数字在:-5~256之间的时候用来赋值的内存地址是不变的
- 【C#】语音识别 - System.Speech
一个有趣的东西,今后可能用得上. C#语音识别:在命名空间 System.Speech下SpeechSynthesizer可以将文字转换成语音 贴出代码: public partial class F ...
