在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通用适配器的更多相关文章

  1. RecyclerView的通用适配器,和滚动时不加载图片的封装

    对于RecyclerView我们需要使用RecyclerAdapter,使用方式与ListViewAdapter类似,具体代码大家可以在网上搜索,这里就只教大家使用封装后的简洁RecyclerAdap ...

  2. RecyclerView的通用适配器

    本来这一个主题应该早就写了,只是项目多,属于自己的时间不多,所以现在才开动!! 前一段时间写了一篇文章,是关于ListView,GriView万能适配器,没有看过的同学,可以先看看那篇文章,然后在来学 ...

  3. listview-android:打造万能通用适配器(转)

    转载:https://blog.csdn.net/q649381130/article/details/51781921: 1.前言 listview作为安卓项目中一个的明星控件,它的适配器的写法是广 ...

  4. ListView ,GridView 通用适配器

    前言 接近半年的时间没有写博客了,今年公司的项目有点多,比较忙,没时间写,这是其一.其次是,这半年来,有时间的时候,我都会看看自己以前写的博客,也许是以前刚刚写博客,经验不足,感觉写出来的博客质量很不 ...

  5. Android教你怎样一步步打造通用适配器

    前言 在Android开发中ListView是最为经常使用的控件之中的一个,基本每一个应用都会涉及到它,要使用ListView列表展示,就不可避免地涉及到另外一个东西--Adapter,我们都知道,A ...

  6. Android开发进阶 -- 通用适配器 CommonAdapter

    在Android开发中,我们经常会用到ListView 这个组件,为了将ListView 的内容展示出来,我们会去实现一个Adapter来适配,将Layout中的布局以列表的形式展现到组件中.     ...

  7. RecyclerView 通用 Adapter

    先看使用方法

  8. 似曾相识的 RecyclerView

    一.常用方法 RecyclerView 与 ListView.GridView 类似,都是可以显示同一种类型 View 的集合的控件. 首先看看最简单的用法,四步走: ①接入 build.gradle ...

  9. RecyclerView全面解析

    写在前面 起深入浅出这名字的时候我是慎重又慎重的,生怕被人骂标题党,写的什么破玩意还敢说深入浅出.所以还是请大家不要抱着太高的期望,因为没有期望就没有失望,就像陈润说的,超预期嘛.全当看小说的心情来看 ...

随机推荐

  1. 具有 Button 风格的 Panel

    unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  2. Action<T> Delegate

    来源:https://docs.microsoft.com/zh-cn/dotnet/api/system.action-1?view=netframework-4.7.2 Action<T&g ...

  3. webGL之three.js入门1

    开场白 最近开始学前端,看了极客学院的前端教学视频,其实有C++或者java基础的人学前端还是很快的.但是html的标签和CSS的样式还是得多code才能熟练,熟能生巧,学以致用. 还在看js,因为有 ...

  4. 学习 MySQL中导入 导出CSV

    学习 MySQL中导入 导出CSV http://blog.csdn.net/sara_yhl/article/details/6850107    速度是很快的 导出 select * from t ...

  5. Base64 转 图片

    static void Main(string[] args) { string s = "iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAIAAAABc2X6AAAAC ...

  6. 黄聪:VS2017调试时提示“运行时无法计算表达式的值”

    具体操作: 工具-选项-调试-常规,选中“使用托管兼容模式”,问题解决

  7. awk中使用shell的环境变量

    awk中使用shell的环境变量一:"'$var'"这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.如:var="test"awk 'BEGIN ...

  8. error while loading shared libraries: xxx.so

    出现error while loading shared libraries: xxx.so错误,一是操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对,二是虽然存在,但是程序 ...

  9. 计划任务at、crontab

    at一次性计划任务 格式: at + 时间 命令 安装at # yum install at -y 如果执行at命令时,出现一下情况 Can't open /var/run/atd.pid to si ...

  10. Vue + TypeScript + ElementUI 封装表头查询组件

    前段时间有朋友私信我 Vue + TypeScript 的问题,然后就打算写一篇 Vue + TypeScript 封装组件的文章 正好公司项目中需要封装一个表头查询组件,就拿出来分享一下~ 组件的整 ...