Android 学习笔记 databinding简单使用:使用databinding在listview加入不同类型的view
代码示例和解析
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相关推荐
- Android学习笔记09:Paint及Canvas的简单应用
2019独角兽企业重金招聘Python工程师标准>>> Android学习笔记09:Paint及Canvas的简单应用 在Android中需要通过graphics类来显示2D图形. ...
- Android学习笔记21:ImageView获取网络图片
Android平台有3种网络接口可以使用,它们分别是:java.net.*(标准java接口).org.apache(Apache接口)和android.net.*(Android网络接口).本文将使 ...
- Android学习笔记(七):多个Activity和Intent
根据www.mars-droid.com:Andriod开发视频教学,先跳过书本<Beginning Android 2>的几个章,我是这两个资源一起看,需要进行一下同步.先初步了解一下应 ...
- Android学习笔记26:图片切换控件ImageSwitcher的使用
在Windows操作系统中,要查看多张图片,可以通过使用"Windows照片查看器"在"上一张"和"下一张"之间切换,进行多张图片的浏览. ...
- Android学习笔记36:使用SQLite方式存储数据
在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...
- Pro Android学习笔记(二九):用户界面和控制(17):include和merge
xml控件代码重用:include 如果我们定义一个控件,需要在不同的layout中重复使用,或者在同一个layout中重复使用,可以采用include的方式.例如定义my_button.xml如下 ...
- Android学习笔记:TabHost 和 FragmentTabHost
2019独角兽企业重金招聘Python工程师标准>>> Android学习笔记:TabHost 和 FragmentTabHostTabHost命名空间:android.widget ...
- 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge
目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...
- Android学习笔记:TabHost 和 FragmentTabHost(转)
Android学习笔记:TabHost 和 FragmentTabHost(转) 转自:http://www.cnblogs.com/asion/p/3339313.html 作者:Asion Tan ...
最新文章
- 【Vegas2006】自我介绍for校青春风采大赛
- 安装python3.7和PyCharm专业版
- Android之Intent.ACTION_MEDIA_SCANNER_SCAN_FILE:扫描指定文件
- golang switch_为什么程序员都不喜欢使用 switch ,而是大量的 if……else if ?
- JAVA常见的RuntimeException
- selenium中Chrome和Firefox浏览器驱动的使用和版本对应
- 231 · 自动补全
- 记一次为公司搭建maven私服的过程
- Excel的通配符使用
- 一生要知道的100幅世界名画
- android xcl charts,我写的Android图表库XCL-Charts,整理好现在开源了!!!
- 第十三届蓝桥杯省赛C++B组题解
- Matlab画星座图
- 互联网3.0时代下垂直搜索的发展研究
- 寻找输入数字中的全数字(pandigital) python编程
- 【SQLite预习课3】SQLite 的常用语法
- Fastjson反序列化讲解
- OGNL表达式的使用
- 计算机系统字体安装程序,windows系统字体安装方法:使用字体安装软件-windows技巧-电脑技巧收藏家...
- linux 深度音乐,网易云音乐Linux V1.1正式发布
热门文章
- php中http有哪些状态码,http状态码是什么意思?http常用状态码有哪些
- cf706C(dp)
- 构建之法:1、2、3章阅读后感
- 使用code::blocks搭建objective-c的IDE开发环境 支持 @interface
- 程序人生:女程序员的求职奋斗史
- 电池供电的电容麦_电容麦一定需要幻象电源吗 幻象电源的作用是什么
- 动态规划——环形子数组的最大和(Leetcode 918)
- 触摸屏开发_Microchip推出新型电容触摸式控制器,加速汽车触摸屏EMI认证
- 分析mrp主要应用范围_超滤膜的应用范围分析
- oracle 不认exp指令,更改oracle字符集导致exp命令出错(解决方法)