今天来说说DataBinding在列表ListView中的使用

主要分为两种,1: 基本的实体类  2:Observable 定义字段

listView布局文件

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

    </data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"> <ListView
android:id="@+id/listview_demo7"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:dividerHeight="5dp"
android:divider="@color/colorAccent"
></ListView> </LinearLayout>
</layout>

主要看item布局

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <import type="com.zhangqie.databinding.demo7.UserBean" /> <variable
name="user"
type="UserBean" /> <import type="com.zhangqie.databinding.demo7.UserObservableBean" /> <variable
name="userObservableBean"
type="UserObservableBean" /> </data> <LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal"> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{`编号:` + user.userId }" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="@{`姓名:` +user.userName}" />
</LinearLayout> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{`年龄:` +user.userAge}" /> <!--表达式判断-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="@{`性别:` + (user.userSex == 1f ? `男` : `女`)}" /> </LinearLayout> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginRight="10dp"
android:orientation="vertical"> <Button
android:id="@+id/btn_update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改数据" /> <Button
android:id="@+id/btn_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="删除数据" />
</LinearLayout>
</LinearLayout>
</layout>

实体类就不给了,几个字段就行

来看看adapter

public class ListViewAdapter extends BaseAdapter {

    private Context context;
private List<UserBean> list;
private LayoutInflater layoutInflater; public ListViewAdapter(List<UserBean> list, Context context) {
this.list = list;
this.context = context;
this.layoutInflater = LayoutInflater.from(context);
} @Override
public int getCount() {
return list.size();
} @Override
public Object getItem(int i) {
return list.get(i);
} @Override
public long getItemId(int i) {
return i;
} @Override
public View getView(int position, View convertView, ViewGroup parent) { Item7MvvmBinding item7MvvmBinding; if (convertView == null){
//创建一个databinding
item7MvvmBinding = DataBindingUtil.inflate(layoutInflater, R.layout.item7_mvvm,parent,false);
//获取convertView
convertView = item7MvvmBinding.getRoot();
}else {
// //去除convertView中bangding的dataBinding
item7MvvmBinding = DataBindingUtil.getBinding(convertView);
}
UserBean userBean = list.get(position);
//绑定数据,这里的BR.user根据item布局文件中的变量声明来决定
item7MvvmBinding.setVariable(com.zhangqie.databinding.BR.user,userBean);
item7MvvmBinding.btnUpdate.setOnClickListener(new OnBtnClickListener(1, userBean));
item7MvvmBinding.btnDelete.setOnClickListener(new OnBtnClickListener(2, position));
return convertView;//也可以直接item7MvvmBinding.getRoot()也行
} public class OnBtnClickListener implements View.OnClickListener{ private int stats;//1,修改;2,删除
private UserBean userBean;
private int position; public OnBtnClickListener(int stats,UserBean userBean){
this.stats = stats;
this.userBean = userBean;
}
public OnBtnClickListener(int stats, int position) {
this.stats = stats;
this.position = position;
} @Override
public void onClick(View view) {
switch (stats){
case 1:
userBean.setUserName("修改后的名字");
Toast.makeText(context,"1",Toast.LENGTH_LONG).show();
notifyDataSetChanged();//刷新数据
break;
case 2:
list.remove(position);
notifyDataSetChanged();
break;
}
}
}
}

activity中

public class Demo7 extends AppCompatActivity {

    Demo7Binding demo7Binding;

    @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
demo7Binding = DataBindingUtil.setContentView(this, R.layout.demo7);
initView();
} private void initView(){
ListViewAdapter listViewAdapter = new ListViewAdapter(initData(),this);
//demo7Binding.listviewDemo7.setAdapter(listViewAdapter);
    
//这是第二种
ListViewObservableAdapter listViewObservableAdapter = new ListViewObservableAdapter(initObservableData(),this);
demo7Binding.listviewDemo7.setAdapter(listViewObservableAdapter); listViewAdapter.notifyDataSetChanged();
} //初始化测试数据
private List<UserBean> initData() {
List<UserBean> list = new ArrayList<>();
for (int i = 1; i < 16; i++) {
UserBean userBean = new UserBean();
userBean.setUserId(i);
userBean.setUserName("切切心语"+i);
userBean.setUserAge(18 + i);
userBean.setUserSex(i % 2 == 0 ? 1 : 0);
list.add(userBean);
}
return list;
} //初始化测试数据
private List<UserObservableBean> initObservableData() {
List<UserObservableBean> list = new ArrayList<>();
for (int i = 1; i < 16; i++) {
UserObservableBean userBean = new UserObservableBean();
userBean.userId.set(i);
userBean.userName.set("切切心语"+i);
userBean.userAge.set(18 + i);
userBean.userSex.set(i % 2 == 0 ? 1 : 0);
list.add(userBean);
}
return list;
} }

上面adapter主要是第一种方式

第二种adapter如下:

public class ListViewObservableAdapter extends BaseAdapter {

    private Context context;
private List<UserObservableBean> list;
private LayoutInflater layoutInflater; public ListViewObservableAdapter(List<UserObservableBean> list, Context context) {
this.list = list;
this.context = context;
this.layoutInflater = LayoutInflater.from(context);
} @Override
public int getCount() {
return list.size();
} @Override
public Object getItem(int i) {
return list.get(i);
} @Override
public long getItemId(int i) {
return i;
} @Override
public View getView(int position, View convertView, ViewGroup parent) { Item7MvvmBinding item7MvvmBinding; if (convertView == null) {
//创建一个databinding
item7MvvmBinding = DataBindingUtil.inflate(layoutInflater, R.layout.item7_mvvm, parent, false);
//获取convertView
convertView = item7MvvmBinding.getRoot();
} else {
// //去除convertView中bangding的dataBinding
item7MvvmBinding = DataBindingUtil.getBinding(convertView);
}
UserObservableBean userBean = list.get(position);
//绑定数据,这里的BR.user根据item布局文件中的变量声明来决定
item7MvvmBinding.setVariable(com.zhangqie.databinding.BR.userObservableBean, userBean);
item7MvvmBinding.btnUpdate.setOnClickListener(new OnBtnClickListener(1, userBean));
item7MvvmBinding.btnDelete.setOnClickListener(new OnBtnClickListener(2, position));
return convertView;//也可以直接item7MvvmBinding.getRoot()也行
} public class OnBtnClickListener implements View.OnClickListener {
private int stats;//1,修改;2,删除
private UserObservableBean userBean;
private int position; public OnBtnClickListener(int stats, UserObservableBean userBean) {
this.stats = stats;
this.userBean = userBean;
} public OnBtnClickListener(int stats, int position) {
this.stats = stats;
this.position = position;
} @Override
public void onClick(View view) {
switch (stats) {
case 1:
userBean.userName.set("修改后的名字");//自动更新数据
break;
case 2:
list.remove(position);
notifyDataSetChanged();
break;
}
}
}
}

把前面讲的Observable 结合到ListView中来简单应用一些

效果如图:

android -------- Data Binding的使用 ( 四 )ListView的更多相关文章

  1. Android Data Binding代码实践(告别findViewById)(四)

    Data Binding实战(一) Data Binding语法解析(二) Data Binding高级用法(三) 好了,继前三篇学习了Data Binding之后,我们可以发现它的强大之处有这么几点 ...

  2. Android Data Binding实战(一)

    在今年Google I/O大会上,Google推出Design Library库的同时也推出了Android Data Binding,那么什么是Data Binding?其名曰数据绑定,使用它我们可 ...

  3. android data binding jetpack I 环境配置 model-view 简单绑定

    android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...

  4. Android Data Binding Library

    Data Binding Library Data Binding Library是一个支持库,允许您使用声明格式(而不是编程)将布局中的UI组件与应用程序中的数据源绑定. 布局通常在调用UI框架方法 ...

  5. Android Data Binding

    Android官方数据绑定框架DataBinding, 1.什么是DataBinding 2.DataBinding基础用法 3.DataBinding原理 4.表达式 5.null检查 6.incl ...

  6. Android Data Binding(数据绑定)用户指南

    Android Data Binding(数据绑定)用户指南 http://www.jianshu.com/p/b1df61a4df77 https://github.com/LyndonChin/M ...

  7. android data binding jetpack VIII BindingConversion

    android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...

  8. android data binding jetpack VII @BindingAdapter

    android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...

  9. android data binding jetpack VI 清理一些概念。BR 运算表达式

    android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...

随机推荐

  1. Git冲突与解决方法【转】

    本文转载自:https://www.cnblogs.com/gavincoder/p/9071959.html Git冲突与解决方法 1.git冲突的场景 情景一:多个分支代码合并到一个分支时: 情景 ...

  2. LVM基本应用,扩展及缩减实现

    一.基本概念 如上图所示:底层PV(物理卷可能是硬盘设备,分区或RAID等),一个或多个PV组织成一个VG(卷组),卷组是不能直接格式化使用的,所以在VG之上,还需要创建LV进行格式化使用.VG在逻辑 ...

  3. 彻底地/ 终于地, 解决 关于apache 权限的问题了:: 修改 DocumentRoot后的 403错误: have no permission to access / on this server

    目录的权限都 应该设置 为 drwxr_xr_x, 即755, 而html下的文件的权限设置为; 644 即可! -x 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性. -w权限, ...

  4. yum仓库中源的配置与使用

    yum 主要功能是更方便的添加/删除/更新RPM 包,自动解决包的倚赖性问题,便于管理大量系统的更新问题. yum 可以同时配置多个资源库(Repository),简洁的配置文件(/etc/yum.c ...

  5. P4720 【模板】扩展卢卡斯

    思路 扩展Lucas和Lucas定理其实没什么关系 我们要求的是这样的一个问题 \[ \left(\begin{matrix}n\\m\end{matrix}\right) mod\ P \] p不一 ...

  6. 题解—— 洛谷 p1993 小K的农场(差分约束&负环判断)

    看到题就可以想到差分约束 判断负环要用dfs,bfs-spfa会TLE 4个点 bfs-spfa #include <cstdio> #include <algorithm> ...

  7. Unity3D学习笔记(二十七):MVC框架下的背包系统(2)

    Tools FileTools using System.Collections; using System.Collections.Generic; using UnityEngine; using ...

  8. Shiro学习笔记四(Shiro集成WEB)

    这两天由于家里出了点事情,没有准时的进行学习.今天补上之前的笔记 -----没有学不会的技术,只有不停找借口的人 学习到的知识点: 1.Shiro 集成WEB 2.基于角色的权限控制 3.基于权限的控 ...

  9. CentOS7使用firewalld和selinux

    转载自莫小安的博客:https://www.cnblogs.com/moxiaoan/p/5683743.html 如何查看和使用selinux https://blog.csdn.net/edide ...

  10. Java—网络编程基础

    URL的应用: 获得网页源代码可以用字节流.字符流,流的获取可以用url.openStream(),也可以用con.getInputStream(): 字节流: URL url = new URL(& ...