android -------- Data Binding的使用 ( 四 )ListView
今天来说说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的更多相关文章
- Android Data Binding代码实践(告别findViewById)(四)
Data Binding实战(一) Data Binding语法解析(二) Data Binding高级用法(三) 好了,继前三篇学习了Data Binding之后,我们可以发现它的强大之处有这么几点 ...
- Android Data Binding实战(一)
在今年Google I/O大会上,Google推出Design Library库的同时也推出了Android Data Binding,那么什么是Data Binding?其名曰数据绑定,使用它我们可 ...
- android data binding jetpack I 环境配置 model-view 简单绑定
android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...
- Android Data Binding Library
Data Binding Library Data Binding Library是一个支持库,允许您使用声明格式(而不是编程)将布局中的UI组件与应用程序中的数据源绑定. 布局通常在调用UI框架方法 ...
- Android Data Binding
Android官方数据绑定框架DataBinding, 1.什么是DataBinding 2.DataBinding基础用法 3.DataBinding原理 4.表达式 5.null检查 6.incl ...
- Android Data Binding(数据绑定)用户指南
Android Data Binding(数据绑定)用户指南 http://www.jianshu.com/p/b1df61a4df77 https://github.com/LyndonChin/M ...
- android data binding jetpack VIII BindingConversion
android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...
- android data binding jetpack VII @BindingAdapter
android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...
- android data binding jetpack VI 清理一些概念。BR 运算表达式
android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...
随机推荐
- topcoder srm 455 div1
problem1 link 令$f[x1][y1][x2][y2]$表示矩形(x1,y1)(x2,y2)中能选出的最大值.dp即可. problem2 link 这个题应该有更好的递推公式. 我的做法 ...
- topcoder srm 702 div1 -3
1.给定一个$n*m$的矩阵,里面的数字是1到$n*m$的一个排列.一个$n*m$矩阵$A$对应一个$n*m$ 的01字符串,字符串的位置$i*m+j$为1当且仅当$A_{i,j}=i*m+j+1$. ...
- bzoj 1735: [Usaco2005 jan]Muddy Fields 泥泞的牧场 最小点覆盖
链接 1735: [Usaco2005 jan]Muddy Fields 泥泞的牧场 思路 这就是个上一篇的稍微麻烦版(是变脸版,其实没麻烦) 用边长为1的模板覆盖地图上的没有长草的土地,不能覆盖草地 ...
- P3178 [HAOI2015]树上操作
P3178 [HAOI2015]树上操作 思路 板子嘛,其实我感觉树剖没啥脑子 就是debug 代码 #include <bits/stdc++.h> #define int long l ...
- Markdown语法参考
参考博客: https://www.jianshu.com/p/f3147a804368 https://www.jianshu.com/p/191d1e21f7ed https://www.jian ...
- pyhon 之 数据类型详解
目录1.字符串2.布尔类型3.整数4.浮点数5.数字6.列表7.元组8.字典9.日期 1.字符串1.1.如何在Python中使用字符串a.使用单引号(')用单引号括起来表示字符串,例如:str='th ...
- Css下拉菜单设置
<style type="text/css"> *{margin:0px;padding:0px;}设置所有标签属性<初始化页面属性> #nav{backg ...
- java web项目在linux部署、启动,查看系统配置常用的linux命令总结
本文为博主原创,未经允许不得转载: 以下为在工作中常用的linux命令进行了总结,主要在项目安装及启动,及编辑部署文件时应用较多1.gz文件是一种压缩文件. 以·tar.gz为扩展名的是一种压缩文件, ...
- HDU 5976 Detachment(拆分)
HDU 5976 Detachment(拆分) 00 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem D ...
- 20165306 实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 实验要求 1.提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图,截图上要有画图加水印,输入自己的学号.本提交点考查JUnit会不会使用,测试 ...