dataBinding与ListView及事件
2015年Google IO大会分布了DataBinding库,能够更快捷便利的实现MVVM结构模式。但是,通过对DataBinding的学习,其中踩过得坑,今天要在这里记录一下。对于DataBinding一些比较基础的使用,在这里就不在记录了,毕竟现在Google一下,出来很多的教程,而且,android developer官网中,也已经对其基本使用方法做了详细介绍,有英语基础的童鞋,还是去看比较官方的文章。如果英文基础不太好的,https://realm.io/cn/news/data-binding-android-boyar-mount/推荐这个博客,会有很大收获的,同时,谢谢棉花糖的这篇文章,解决了很多的疑惑。
关于配置环境:
2.0以上的 Android Studio 已经内置了对 Android Data Binding 框架的支持,配置起来也很简单,只需要在 app 的 build.gradle 文件中添加下面的内容就好了
dataBinding{
enabled = true
}
但是,gradle的版本,至少得是1.5.0以上,否则配置会很麻烦。因为本人使用的Android studio版本是2.1.3,gradle也更改成了2.1.3,所以,不需要做过多的设置。但是有一点,Android studio对DataBinding的支持还不是完全的兼容,有些地方确实有点坑。
关于使用:
最近,把之前写的一个小项目,更改成了DataBinding的架构模式。感觉Android studio2.1.3版本已经很新了,但是对于一些属性的提示还不是很好,并不是完全支持的。比较基础的使用方法,在这里就不在提了,主要是写一下对ListView以及GridView的使用,还有就是对adapter的写法,以及点击跳转的事件。
首先,先是写一个ListView或者GridView的xml文件,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable
name="adapter"
type="android.widget.BaseAdapter"/> </data> <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:adapter="@{adapter}"/> </LinearLayout>
</layout>
重点在app:adapter="@{adapter}"这句话中,主要是自定义一个adapter,来对ListView或者GridView进行数据的绑定。
然后,最主要的,其实就是适配器的写法。在以往的写法中,BaseAdapter肯定需要ViewHolder来进行视图的绑定,并且做缓存。那么,在DataBinding中,完全不需要ViewHolder,而且,针对单布局的话,完全可以写个通用的adapter,针对一般的小项目,这个adapter完全的够用,那么,现在先来随便写一个adapter的item的xml文件,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> <data>
<variable
name="userbean"
type="com.lqy.newtestdemo.UserBean"/>
</data> <RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"> <ImageView
android:id="@+id/image"
android:layout_width="150dp"
android:layout_height="100dp"
android:layout_marginRight="5dp"
app:imageUrl="@{userbean.picUrl}"/> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/image"
android:orientation="vertical"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{userbean.title}"
android:textColor="@android:color/black"
android:textSize="20sp"/> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="@{userbean.ctime}"/> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="@{userbean.description}"/>
</LinearLayout>
</RelativeLayout>
</layout>
可以看到,布局中,主要是通过data中的variable属性来标识一个变量名,在控件中,只需要android:text="@{userbean.title}",就能进行变量的赋值,这个在基础用法中都有说明,这里就不在论述。下面就是重点了,关于BaseAdapter的写法,废话不多说,直接上代码:
package com.lqy.newtestdemo; import android.content.Context;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter; import java.util.List; /**
* 通用的adapter
* Created by LQY on 2016/10/10.
*/
public class ListAdapter<T> extends BaseAdapter {
private Context context;
private List<T> list;
private int layoutId;//单布局
private int variableId; public ListAdapter(Context context, List<T> list, int layoutId, int variableId) {
this.context = context;
this.list = list;
this.layoutId = layoutId;
this.variableId = variableId;
} @Override
public int getCount() {
return list.size();
} @Override
public Object getItem(int position) {
return list.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewDataBinding binding = null;
if (convertView == null){
binding =DataBindingUtil.inflate(LayoutInflater.from(context),layoutId,parent,false);
} else {
binding = DataBindingUtil.getBinding(convertView);
}
binding.setVariable(variableId,list.get(position));
return binding.getRoot();
}
}
在这里可以看到,完全看不到ViewHolder的踪迹,而且,只需几行的代码,就能将适配器写好,并且,可以用到多个ListView或者GridView中,adapter设置好以后,只需要在Activity中加入这样两句话就可以:
ListAdapter<UserBean> adapter = new ListAdapter<>(MainActivity.this, list, R.layout.item, BR.userbean);
binding.setAdapter(adapter);
binding怎么来的,这里就不在论述,请大家去看基础使用方法。那么,在写一个通用的adapter的时候,我们可以看到ListAdapter的泛型所代表的,其实就是一个Bean文件,是你需要赋值的那个文件。list代表的是一个List的列表值,这个列表可以是你在Json解析出来得列表值,也可以是你通过list.add所附的值,这些就要看你项目的需要了。最坑的地方在BR上,BR说起来就跟项目本身会产生的R文件是一个道理,只不过,BR是DataBinding所产生的一个R文件,也需要导入一个BR的包,当然,如果项目没什么问题的,Android studio会提醒这个BR值导包的。我踩到的坑是,明明代码中没有任何问题,也没有错出现,第一次运行成功了,第二次在运行的时候,就提示BR文件找不到,包删了重新导都导不进去,clean一下不管用,包还是导不进去,Rebuild一下,提示找不到BR包,怎么都过不去。最后我只能把整个Android studio关掉在重新打开,发现BR包导进去了,然后也没BUG了,运行也成功了。。。所以,如果你也遇到这种情况了,就请关闭Android studio并且重新打开一下,如果还没好,就证明你的程序其实是有错误的,仔细找找就好。差不多就这个样子吧。
下面还有一个问题,那就是关于点击跳转的问题。在其他的一些教程里面,可能只写到了onClick事件的绑定,其中能实现的,就是改变当前数值或者字段。但是,还没一些教程来讲如何进行跳转。现在我就来讲一下跳转如何实现,先看代码:
binding.listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(MainActivity.this, WebActivity.class);
intent.putExtra("url", list.get(position).getUrl());
startActivity(intent);
}
});
在Activity页面,还可以使用setOnItemClickListener方法。之前在调用setOnItemClickListener方法的时候,先是定义一个ListView的变量名,然后findByViewId来关联上xml文件的ListView的ID值,然后才能调用其方法。用了DataBinding以后,只要用binding.listView就可以直接调用点击事件,完全不需要在findByViewId,而listView其实就是xml里面的ID值,而这个变形的ID值其实是DataBinding根据ID值自动生成的,你只需要记得你起的名字是什么,根据大概的规律来找到自己定义的ID就好,这里并没有什么难度。不光ListView可以这样用,这个同样适用于GridView。我在项目中也用到了GridView,亲测这个ListAdapter同样适用于GridView。并且,在我的项目里,是一个页面用到了两个GridView,只需要在data中定义两个不同的variable值,并且name的定义名称要定义不同的名字,这样就可以同时使用一个ListAdapter了,后期我会将源码放上来,这里只是记录一下我使用的方法,以及需要注意的地方。
有写的不对的地方希望大伙指出来,也希望我这篇文章能帮到正在DataBinding中挣扎的童鞋。
dataBinding与ListView及事件的更多相关文章
- Android实现页面跳转、ListView及其事件
Android实现页面跳转.ListView及其事件 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 进入主页面后,使用ListView实现特 ...
- Android开发(十六)——Android listview onItemClick事件失效的原因
参考: Android listview onItemClick事件失效的原因.http://blog.csdn.net/wangchun8926/article/details/8793178
- listView滚动事件
listView滚动事件 实现接口: android.widget.AbsListView.OnScrollListener Interface definition for a callback t ...
- android开发步步为营之65:解决ScrollView和ListView触摸事件onInterceptTouchEvent相互冲突问题
近期项目里面有个需求,一个页面放了一个ScrollView,整个页面能够向上滚动,然后ScrollView里面又嵌套了一个ListView,ListView里面的数据也是能够上下滑动的,理论上List ...
- 完美解决ListView中事件ItemCreated中使用ClientID导致插入数据失败
于昨天晚上看到视频做到这个例子,但是发现始终有错误,在ListView的ItemCreated事件中使用了ClientID则会导致数据插入数据库失败.当点击插入按钮时,网页就像点击F5刷新一样,无任何 ...
- Android ListView焦点事件冲突问题与解决
Android ListView对于单纯列表展示是很好用的,但是一旦牵扯到对listView进行操作就会遇到各种各样的问题.比如保存Checkbox状态与item复用的冲突.遇到可获取焦点的控件比如说 ...
- scrollview嵌套listview 滑动事件冲突的解决方法
listView.setOnTouchListener(new View.OnTouchListener() { @Override ...
- ListView(3)关于listview滚动事件,何时滚动到顶部或底部
给listview设置一个OnScrollListener就可 ListView.OnScrollListener scrollListener = new ListView.OnScrollList ...
- fragment中listview触发事件setOnItemClickListener不好使
<listView/>中// listview点击 ,高度wrap_content改成fill_prarent
随机推荐
- Linux系统下Qt环境搭建
http://www.linuxidc.com/Linux/2013-07/87576.htm 主要是需要提前安装一些动态库,否则编译的时候会出现 /usr/bin/ld: cannot find - ...
- 108th LeetCode Weekly Contest Binary Subarrays With Sum
In an array A of 0s and 1s, how many non-empty subarrays have sum S? Example 1: Input: A = [1,0,1,0, ...
- c++ 222
[成功者的习惯] 1.背后说别人好话:听到某人说别人坏话时只微笑: 2.过去的事不全让人知道: 3. 尊敬不喜欢你的人:对事无情,对人有情: 4.多做自我批评:为别人喝彩: 5.感恩:学会 ...
- 计算机插U盘没用了
今天遇到一个神奇的状况,我想把台机上面的文件通过U盘拷贝到我的笔记本上.文件拷到U盘上没问题,然后把U盘插到笔记本上,一点反应都没有.我想了下,这U盘肯定没坏.然后我笔记本又是新买没多久,一直爱护有加 ...
- 解决windows10活动历史记录删除问题
Windows10日常办公过程中系统会记录很多活动历史记录信息,我是不希望我的活动历史记录随时可以被别人查看,虽然电脑有设置密码,但是办公电脑还是习惯将历史记录删除掉,并且永远禁用windows10的 ...
- libevent 同性恋 讲解
https://aceld.gitbooks.io/libevent/content/25hong_fa_mo_5f0f_md.html github 这url 干活比较好 https://githu ...
- oracle 基础知识(十一)----表空间结构
一,逻辑结构图 二.tablespace 01,Oracle表空间 它是一个逻辑的概念,它在物理上是不存在的. 02,oracle 存储结构 03.表空间特性 一个数据库可以包含多个表空间,一个表空间 ...
- GreenPlum 大数据平台--非并行备份(六)
一,非并行备份(pg_dump) 1) GP依然支持常规的PostgreSQL备份命令pg_dump和pg_dumpall 2) 备份将在Master主机上创建一个包含所有Segment数据的大的备份 ...
- (转)Linux curl命令参数详解
Linux curl命令参数详解 命令:curl在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具, ...
- C++ Memory System Part1: new和delete
在深入探索自定义内存系统之前,我们需要了解一些基础的背景知识,这些知识点是我们接下来自定义内存系统的基础.所以第一部分,让我们来一起深入了解一下C++的new和delete家族,这其中有很多令人吃惊的 ...