代码示例和解析

User.java(略)
包含String类型的name和int类型的age,构造方法包含这两个参数。包含getter和setter
item_title.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variable
            name="handler"type="com.example.hjcai.myapplication.EventHandler"></variable></data><Button
        android:id="@+id/userbtn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="@{handler::onClickFriend}"android:text="xnxnxnx"/>
</layout>

显示标题的格式
EventHandler.java

public class EventHandler {private Context mContext;public EventHandler(Context context) {mContext = context;}public void onClickFriend(View view) {Toast.makeText(mContext, "onClickFriend", Toast.LENGTH_LONG).show();}
}

使用databinding构建事件监听的格式如上所示(xml+java)
item_user_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variable
            name="useritem"type="com.example.hjcai.myapplication.data.User" /></data><LinearLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:padding="5dp"><TextView
            android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="@{useritem.name}" /><TextView
            android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text='@{"" +useritem.age}' /></LinearLayout>
</layout>

显示user信息的布局格式,具体数据是如何与xml绑定的
UserAdapter.java

public class UserAdapter extends BaseAdapter{private List<User> userList;private Context context;public UserAdapter(Context context, List<User> userList) {this.userList = userList ;this.context = context ;}@Overridepublic int getCount() {//need add the count of titlereturn userList.size()+1;}@Overridepublic User getItem(int position) {//need exclude index 0(it is position for title)if(position>0){//position 0 is title,so position from need - 1,that's the position for usersreturn userList.get(position-1);}else{return null;}}@Overridepublic long getItemId(int position) {return position;}@Overridepublic int getViewTypeCount() {//there two type of viewreturn 2;}@Overridepublic int getItemViewType(int position) {if (position ==0){//if position is 0,it is type for titlereturn 0;}else{//if not,it is type for userreturn 1;}}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {ItemUserLayoutBinding itemUserLayoutBinding = null;ItemTitleBinding itemTitleBinding = null;//需要区分user和title的显示,其实按照如下格式,代码可读性更强//if (convertView == null) {//    switch (type) {//        case 0://            ...//            //all code for title//        case 1://            ...//            //all code for user//        default://            return null;int type = getItemViewType(position);if (convertView == null) {switch (type) {case 0:itemTitleBinding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.item_title, parent, false);convertView = itemTitleBinding.getRoot();break;case 1:itemUserLayoutBinding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.item_user_layout, parent, false);convertView = itemUserLayoutBinding.getRoot();break;}} else {switch (type) {case 0:itemTitleBinding = DataBindingUtil.getBinding(convertView);break;case 1:itemUserLayoutBinding = DataBindingUtil.getBinding(convertView);break;}}switch (type) {case 0:itemTitleBinding.setHandler(new EventHandler(context));return itemTitleBinding.getRoot();case 1:convertView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(context, "Click " + position, Toast.LENGTH_SHORT).show();}});itemUserLayoutBinding.setUseritem(userList.get(position - 1));return itemUserLayoutBinding.getRoot();default:return null;}}
}

ItemUserLayoutBinding是item_user_layout.xml自动生成的对应java文件,用于获取xml中的数据和对象,与Java文件通信
ItemTitleBinding则是item_title.xml自动生成的对应java文件,用于获取xml中的数据和对象,与Java文件通信
他们可以通过DataBindingUtil.inflate方法来获得可以获取xml内容的binding对象
在xml定义如下的格式

    <data><variablename="useritem"type="com.example.hjcai.myapplication.data.User" /></data>

则对应binding文件会生成对应useritem的set和get方法。

activity_main.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android"><data></data><LinearLayout
        android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent" ><ListView
            android:id="@+id/listAll"android:layout_width="match_parent"android:layout_height="wrap_content"></ListView></LinearLayout>
</layout>

显示list(list将包含title和useritem,title和useritem以前滚动)
MainActivity.java

public class MainActivity extends AppCompatActivity {private List<User> mUserList;private UserAdapter mUserAdapter;ActivityMainBinding mainBinding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);initData();}private void initData() {mUserList = new ArrayList<User>();for (int i=0;i<20;i++){User u = new User("Caihuijian",27);mUserList.add(u);}mUserAdapter = new UserAdapter(this,mUserList);mainBinding.listAll.setAdapter(mUserAdapter);}
}

databinding的xml中凡是定义了id的数据均可以通过binding对象直接点出来。例如mainBinding.listAll就是activity_main.xml中的id为listAll的listview

想在listview加入不同类型的view的核心代码在adapter中

databing list的一般结构(与上述代码无关)

通常情况,Android的databinding包括以下几类对象(名称都为代指,非具体类名文件名)
MainActivity:显示的界面
MyDataList:存储显示列表的内容
activity_main:显示界面对应的xml布局
MyBindings:界面xml中对应方法,会由Android机制自动调用其中的方法
MyAdapter:list的adapter,在dataBinding中不需要手动设置,在MyBindings写好,会由Android机制自动调用
item_title.xml:显示item的布局,在Adapter的getView方法中设置。
他们的关系如下:
MainActivity负责界面显示,通过setData之类的方法,将list数据存储在MyDataList实例中;MyDataList与其布局文件activity_main紧密关联,可以通过databing来实现;activity_main中一般会包含app:xxx方法,而该方法的定义一般在MyBindings中,由Android databinding机制自动调用;在MyBindings中一般会存在setAdapter的调用,用于绑定list和Adapter,当然,Adapter一般是自定义的Adapter,例如MyAdapter;而Adapter的getView方法中,会涉及填充item项的相关逻辑。
其中MyDataList可以理解为model的集合,比如Users;而item_title的存放内容,则是单一的model,比如User。
如果用图形则关系可以表示为:

Android 学习笔记 databinding简单使用:使用databinding在listview加入不同类型的view相关推荐

  1. Android学习笔记09:Paint及Canvas的简单应用

    2019独角兽企业重金招聘Python工程师标准>>> Android学习笔记09:Paint及Canvas的简单应用 在Android中需要通过graphics类来显示2D图形. ...

  2. Android学习笔记21:ImageView获取网络图片

    Android平台有3种网络接口可以使用,它们分别是:java.net.*(标准java接口).org.apache(Apache接口)和android.net.*(Android网络接口).本文将使 ...

  3. Android学习笔记(七):多个Activity和Intent

    根据www.mars-droid.com:Andriod开发视频教学,先跳过书本<Beginning Android 2>的几个章,我是这两个资源一起看,需要进行一下同步.先初步了解一下应 ...

  4. Android学习笔记26:图片切换控件ImageSwitcher的使用

    在Windows操作系统中,要查看多张图片,可以通过使用"Windows照片查看器"在"上一张"和"下一张"之间切换,进行多张图片的浏览. ...

  5. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  6. Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    xml控件代码重用:include 如果我们定义一个控件,需要在不同的layout中重复使用,或者在同一个layout中重复使用,可以采用include的方式.例如定义my_button.xml如下 ...

  7. Android学习笔记:TabHost 和 FragmentTabHost

    2019独角兽企业重金招聘Python工程师标准>>> Android学习笔记:TabHost 和 FragmentTabHostTabHost命名空间:android.widget ...

  8. 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...

  9. Android学习笔记:TabHost 和 FragmentTabHost(转)

    Android学习笔记:TabHost 和 FragmentTabHost(转) 转自:http://www.cnblogs.com/asion/p/3339313.html 作者:Asion Tan ...

最新文章

  1. 【Vegas2006】自我介绍for校青春风采大赛
  2. 安装python3.7和PyCharm专业版
  3. Android之Intent.ACTION_MEDIA_SCANNER_SCAN_FILE:扫描指定文件
  4. golang switch_为什么程序员都不喜欢使用 switch ,而是大量的 if……else if ?
  5. JAVA常见的RuntimeException
  6. selenium中Chrome和Firefox浏览器驱动的使用和版本对应
  7. 231 · 自动补全
  8. 记一次为公司搭建maven私服的过程
  9. Excel的通配符使用
  10. 一生要知道的100幅世界名画
  11. android xcl charts,我写的Android图表库XCL-Charts,整理好现在开源了!!!
  12. 第十三届蓝桥杯省赛C++B组题解
  13. Matlab画星座图
  14. 互联网3.0时代下垂直搜索的发展研究
  15. 寻找输入数字中的全数字(pandigital) python编程
  16. 【SQLite预习课3】SQLite 的常用语法
  17. Fastjson反序列化讲解
  18. OGNL表达式的使用
  19. 计算机系统字体安装程序,windows系统字体安装方法:使用字体安装软件-windows技巧-电脑技巧收藏家...
  20. linux 深度音乐,网易云音乐Linux V1.1正式发布

热门文章

  1. php中http有哪些状态码,http状态码是什么意思?http常用状态码有哪些
  2. cf706C(dp)
  3. 构建之法:1、2、3章阅读后感
  4. 使用code::blocks搭建objective-c的IDE开发环境 支持 @interface
  5. 程序人生:女程序员的求职奋斗史
  6. 电池供电的电容麦_电容麦一定需要幻象电源吗 幻象电源的作用是什么
  7. 动态规划——环形子数组的最大和(Leetcode 918)
  8. 触摸屏开发_Microchip推出新型电容触摸式控制器,加速汽车触摸屏EMI认证
  9. 分析mrp主要应用范围_超滤膜的应用范围分析
  10. oracle 不认exp指令,更改oracle字符集导致exp命令出错(解决方法)