Android官方DataBinding(三):RecyclerView 使用ViewDataBinding更新数据
来源:互联网 发布:苍云脸型数据 编辑:程序博客网 时间:2024/05/18 17:00
Android官方DataBinding(三):RecyclerView 使用ViewDataBinding更新数据
本例基于Android官方DataBinding,在RecyclerView上实现一个简单需求:点击一个button按钮,增加一个数据元素,并更新的view上。
(1)首先写一个布局,这个布局上面放一个按钮button,下面一个标准Android RecyclerView。Button按钮的实现一个简单的功能:没点击一次就增加一个数据元素,然后更新到RecyclerView。recycler_view_layout.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="添加元素" /> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /></LinearLayout>
(2)和附录文章1,2,写数据模型User,对比这个User和附录1,2的User建模时候的异同,User.java:
package zhangphil.test;import android.databinding.BaseObservable;//import android.databinding.Bindable;/** * Created by Phil on 2017/8/17. */public class User extends BaseObservable { private String id; private String name; private String blog; public void setId(String id) { this.id = id; //notifyPropertyChanged(BR.id); } //@Bindable public String getId() { return this.id; } public void setName(String name) { this.name = name; //notifyPropertyChanged(BR.name); } //@Bindable public String getName() { return this.name; } public void setBlog(String blog) { this.blog = blog; //notifyPropertyChanged(BR.blog); } //@Bindable public String getBlog() { return this.blog; }}
(3)因为是一个RecyclerView,RecyclerView需要Adapter,在Adapter中需要一个布局layout,为User的数据找到View,Adapter需要的子view布局这里将写View和Model的绑定代码,item.xml:
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="zhangphil.test.User" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.id}" android:textColor="@android:color/holo_red_light" /> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}" android:textColor="@android:color/holo_red_light" /> <TextView android:id="@+id/blog" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.blog}" android:textColor="@android:color/holo_red_light" /> <View android:layout_width="match_parent" android:layout_height="1px" android:background="@android:color/holo_blue_bright" /> </LinearLayout></layout>
(4)上层Java代码,注意观察ViewHolder的写法。比较关键的是在创建ViewHolder时候传入的ViewDataBinding。在Adapter的onBindViewHolder里面,仅需两行代码就实现数据模型和View的绑定,MainActivity.java:
package zhangphil.test;import android.databinding.DataBindingUtil;import android.databinding.ViewDataBinding;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import java.util.ArrayList;import static zhangphil.test.BR.user;public class MainActivity extends AppCompatActivity { private int index = 0; private ItemAdapter mItemAdapter; private ArrayList<User> mItems; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.recycler_view_layout); mItems = new ArrayList(); for (int i = 0; i < 1; i++) { User u = new User(); u.setId(index + ""); u.setName("zhangphil @" + index); u.setBlog("blog.csdn.net/zhangphil @" + index); mItems.add(u); index++; } RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); mItemAdapter = new ItemAdapter(); mRecyclerView.setAdapter(mItemAdapter); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { User u = new User(); u.setId(index + ""); u.setName("zhangphil @" + index); u.setBlog("blog.csdn.net/zhangphil @" + index); mItems.add(u); mItemAdapter.notifyDataSetChanged(); index++; } }); } private class ItemAdapter extends RecyclerView.Adapter<ItemViewHolder> { @Override public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), R.layout.item, viewGroup, false); ItemViewHolder holder = new ItemViewHolder(binding); return holder; } @Override public void onBindViewHolder(ItemViewHolder viewHolder, int i) { viewHolder.getBinding().setVariable(user, mItems.get(i)); viewHolder.getBinding().executePendingBindings(); } @Override public int getItemCount() { return mItems.size(); } } private class ItemViewHolder extends RecyclerView.ViewHolder { private ViewDataBinding binding; public ItemViewHolder(ViewDataBinding binding) { super(binding.getRoot()); this.binding = binding; } public void setBinding(ViewDataBinding binding) { this.binding = binding; } public ViewDataBinding getBinding() { return this.binding; } }}
代码运行结果,每点击一次button,数据增加一个,更新:
附录:
1,《Android官方DataBinding简例(一)》链接:http://blog.csdn.net/zhangphil/article/details/77322530
2,《Android官方DataBinding(二):动态数据更新notifyPropertyChanged》链接:http://blog.csdn.net/zhangphil/article/details/77328688
阅读全文
0 0
- Android官方DataBinding(三):RecyclerView 使用ViewDataBinding更新数据
- Android官方DataBinding(二):动态数据更新notifyPropertyChanged
- DataBinding系列(三):RecyclerView中使用DataBinding
- Android官方数据绑定框架DataBinding(一)
- Android官方数据绑定框架DataBinding(二)
- Android官方数据绑定框架DataBinding
- Android官方数据绑定框架DataBinding(一)
- Android官方数据绑定框架DataBinding(二)
- Android官方数据绑定框架DataBinding(一)
- Android官方数据绑定框架DataBinding(二)
- Android官方数据绑定框架DataBinding
- Android官方数据绑定框架DataBinding
- Android官方数据绑定框架DataBinding
- Android官方数据绑定框架DataBinding
- Android官方数据绑定框架DataBinding
- Android官方数据绑定框架DataBinding
- Android官方数据绑定框架DataBinding
- Android官方数据绑定框架DataBinding(一)
- Nginx源码阅读(ngx_master_process_cycle)
- 栈应用之括号匹配
- WebRTC之channel(五)
- 目前市面上性价比最好的三模北斗定位导航模块ATGM336H
- 将彩色视频转换为灰度视频源代码
- Android官方DataBinding(三):RecyclerView 使用ViewDataBinding更新数据
- springboot集成swagger的应用
- HDU 6114
- 一个疯狂的地下市场--支付牌照的买卖
- 数据仓库是干什么的,到现在,我终于看到了成果
- 搭建商城小程序
- 【百度运营部】面试记录
- jmeter的response乱码问题解决
- KETTLE java.lang.OutOfMemoryError: Java heap space 内存溢出错误