android -------- Data Binding的使用 RecyclerView

今天来说说DataBinding在列表RecyclerView中的使用

列表绑定

App中经常用到列表展示,Data Binding在列表中一样可以扮演重要的作用,直接绑定数据和事件到每一个列表的item。

RecyclerView

过去我们往往会使用ListView、GridView、或者GitHub上一些自定义的View来做瀑布流。自从RecyclerView出现后,我们有了新选择,只需要使用LayoutManager就可以。

RecyclerView内置的垃圾回收,ViewHolder、ItemDecoration装饰器机制都让我们可以毫不犹豫地替换掉原来的ListView和GridView。

主布局:

<?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"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <Button
                android:id="@+id/btn_demo8_add"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="添加" />

            <Button
                android:id="@+id/btn_demo8_refresh"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_weight="1"
                android:text="刷新" />

            <Button
                android:id="@+id/btn_demo8_delete"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_weight="1"
                android:text="删除" />
        </LinearLayout>

        <android.support.v7.widget.RecyclerView
            android:id="@+id/demo8_recyclerview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"></android.support.v7.widget.RecyclerView>
    </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.demo8.UserObservableBean"/>

        <variable
            name="userObserBean"
            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_weight="1"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:gravity="center"
            >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{`编号:` + userObserBean.userId }" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{`姓名:` +userObserBean.userName}"
                android:layout_marginTop="5dp"
                />
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:gravity="center"
            >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{`年龄:` +userObserBean.userAge}"
                />

            <!--一定要使用1f而不能是使用1 ,类型必须相对应-->
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="@{`性别:` + (userObserBean.userSex == 1f ? `男` : `女`)}" />

        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:layout_marginRight="10dp"
            android:paddingBottom="10dp"
            >

            <Button
                android:id="@+id/btn_update"
                android:layout_width="wrap_content"
                android:layout_height="40dp"
                android:text="修改数据" />

            <Button
                android:id="@+id/btn_delete"
                android:layout_width="wrap_content"
                android:layout_height="40dp"
                android:layout_marginTop="5dp"
                android:text="删除数据" />
        </LinearLayout>
    </LinearLayout>
</layout>

ViewHolder

public class RecyclerViewHolder extends RecyclerView.ViewHolder {

    public Item8MvvmBinding getItem8MvvmBinding() {
        return item8MvvmBinding;
    }

    public void setItem8MvvmBinding(Item8MvvmBinding item8MvvmBinding) {
        this.item8MvvmBinding = item8MvvmBinding;
    }

    //这里只要给RecyclerView.ViewHolder返回一个view就可以,所以我们将构造方法中传入databinding
    Item8MvvmBinding item8MvvmBinding;

    public RecyclerViewHolder(Item8MvvmBinding item8MvvmBinding) {
        super(item8MvvmBinding.getRoot());
        this.item8MvvmBinding = item8MvvmBinding;
    }
}

adapter:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolder> implements View.OnClickListener{

    private List<UserObservableBean> list;
    private Random random = new Random(System.currentTimeMillis());

    public RecyclerViewAdapter(List<UserObservableBean> list) {
        this.list = list;
    }

    public OnItemOnClickListener getOnItemOnClickListener() {
        return onItemOnClickListener;
    }

    public void setOnItemOnClickListener(OnItemOnClickListener onItemOnClickListener) {
        this.onItemOnClickListener = onItemOnClickListener;
    }

    private OnItemOnClickListener onItemOnClickListener;

    public interface OnItemOnClickListener{
        void onItemClick(View view, int position);
    }

    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Item8MvvmBinding item8MvvmBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item8_mvvm,parent,false);
        item8MvvmBinding.getRoot().setOnClickListener(this);
        return new RecyclerViewHolder(item8MvvmBinding);
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolder holder, int position) {
        Item8MvvmBinding item8MvvmBinding = holder.getItem8MvvmBinding();
        UserObservableBean userObservableBean = list.get(position);
        item8MvvmBinding.setVariable(com.zhangqie.databinding.BR.userObserBean,userObservableBean);
        //将position保存在itemView的Tag中,以便点击时进行获取
        item8MvvmBinding.getRoot().setTag(position);
        item8MvvmBinding.btnUpdate.setOnClickListener(new OnBtnClickListener(1, userObservableBean));
        item8MvvmBinding.btnDelete.setOnClickListener(new OnBtnClickListener(2, position));
        // 立刻执行绑定
        item8MvvmBinding.executePendingBindings();
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public void addData(UserObservableBean userObservableBean){
        int position = random.nextInt(list.size()+1);
        list.add(position,userObservableBean);
        notifyItemInserted(position);//添加操作的动画
    }

    public void deleteData(int positionn){
        if (list.size() == 0){
            return;
        }
        int position = random.nextInt(list.size());
        list.remove(position);
        notifyItemRemoved(position);//删除操作的动画
    }

    @Override
    public void onClick(View view) {
        if (onItemOnClickListener != null)
            onItemOnClickListener.onItemClick(view, (int) view.getTag());
    }

    private class OnBtnClickListener implements View.OnClickListener{

        private int stats;//1,修改;2,删除
        private UserObservableBean userBean;
        private int position;

        OnBtnClickListener(int stats, UserObservableBean userBean) {
            this.stats = stats;
            this.userBean = userBean;
        }

        OnBtnClickListener(int stats, int position) {
            this.stats = stats;
            this.position = position;
        }

        @Override
        public void onClick(View v) {
            switch (stats) {
                case 1:
                    userBean.userName.set("修改后的名字");
                    break;
                case 2:
                    list.remove(position);
                    notifyDataSetChanged();
                    break;
            }
        }
    }

}

主Activity:

public class Demo8 extends AppCompatActivity {

    Demo8Binding demo8Binding;
    RecyclerViewAdapter recyclerViewAdapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        demo8Binding = DataBindingUtil.setContentView(this, R.layout.demo8);
        initView();
    }

    private void initView(){
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        demo8Binding.demo8Recyclerview.setLayoutManager(layoutManager);
        recyclerViewAdapter = new RecyclerViewAdapter(initObservableData());
        demo8Binding.demo8Recyclerview.setAdapter(recyclerViewAdapter);

        //item的点击事件
        recyclerViewAdapter.setOnItemOnClickListener(new RecyclerViewAdapter.OnItemOnClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(Demo8.this, "行数:" + position, Toast.LENGTH_LONG).show();
            }
        });

        demo8Binding.btnDemo8Add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                UserObservableBean userBean = new UserObservableBean();
                userBean.userId.set(8);
                userBean.userName.set("切切心语"+8);
                userBean.userAge.set(25);
                userBean.userSex.set(8 % 2 == 0 ? 1 : 0);
                recyclerViewAdapter.addData(userBean);
            }
        });
        demo8Binding.btnDemo8Refresh.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              recyclerViewAdapter.notifyDataSetChanged();
            }
        });
        demo8Binding.btnDemo8Delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                recyclerViewAdapter.deleteData(1);
            }
        });
    }

    //初始化测试数据
    private List<UserObservableBean> initObservableData() {
        List<UserObservableBean> list = new ArrayList<>();
        for (int i = 1; i < 6; 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;
    }
}

自己练习的一个RecyclerView + Databinding使用

效果如图:

原文地址:https://www.cnblogs.com/zhangqie/p/9636759.html

时间: 2024-10-10 14:14:03

android -------- Data Binding的使用 RecyclerView的相关文章

Android Data Binding代码实践(告别findViewById)

Data Binding实战(一) Data Binding语法解析(二) Data Binding高级用法(三) 好了,继前三篇学习了Data Binding之后,我们可以发现它的强大之处有这么几点: 1.使用MVVM模式,让整个项目结构清晰明了 2.通过ViewModel连接View和Model,使得View与Model层解耦,分层后各司其职,维护方便 3.易于项目的测试 4.可以根据id自动生成View的对象,再也不用findViewById了 好了,说了好处,当然也有不太好的地方,毕竟是

Android Data Binding 技术

Android Data Binding 技术

Android Data Binding

1 引入 如何高效地实现以下界面? 有好几年findViewById实战经验的我,感觉并不难啊.一般会 * 1.先定义一个User的Model类,数据来自JSON解析: * 2.创建一个xml,随后在xml中布局完所有View,对头像.标题.积分.登录按钮一个id: * 3.在Activity中通过findViewById获取到头像ImageView.标题TextView.积分TextView.登录Button,然后给Button设置监听器,再根据登陆状态展示对应数据: 实现如下: * User

Android Data Binding实战(一)

在今年Google I/O大会上,Google推出Design Library库的同时也推出了Android Data Binding,那么什么是Data Binding?其名曰数据绑定,使用它我们可以轻松实现MVVM(模型-视图-视图模型)模式,来实现应用之间数据与视图的分离.视图与业务逻辑的分离.数据与业务逻辑的分离,从而达到低耦合.可重用性.易测试性等好处,那么我们首先先来看看什么是MVVM模式. 我自己画了一张图来帮助理解,就不多描述了,毕竟重点是Data Binding的使用 通过上图

Android Data Binding 系列(二) -- Binding与Observer实现

写在前面 上篇文章 Android Data Binding 系列(一) – 详细介绍与使用 介绍了 Data Binding 的基础及其用法,本文接上篇,结合DataBindingDemo 来学习下 Data Binding 的实现. 绑定实现 Activity在inflate layout时,通过DataBindingUtil来生成绑定,从代码看,是遍历contentView得到View数组对象,然后通过数据绑定library生成对应的Binding类,含Views.变量.listeners

Android Data Binding Library 官方文档(译)

地址:https://developer.android.google.cn/topic/libraries/data-binding/index.html 本文地址:http://blog.csdn.net/jjwwmlp456/article/details/54915981 Data Binding Library (数据绑定库),旨在减少绑定应用程序逻辑和布局所需的一些耦合性代码 最低支持Android 2.1 (API Level 7) 构建环境 使用gradle插件1.5-alpha

完全掌握Android Data Binding

转载:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0603/2992.html 来源 https://github.com/LyndonChin/MasteringAndroidDataBinding 编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! 本教程是跟着 Data Bind

Android Data Binding高级用法-Observable、动态生成Binding Class

设置View的id 虽然说Data Binding这种分层模式使得我们对数据的传递简单明了,一般情况下我们可以不设置View的id,不使用findViewById即可对View进行数据上一系列的操作,不过有时候根据情况我们需要对某些View设置id,但是还是可以不findViewById即可得到该控件的对象,因为设置id后ViewDataBinding类会自动生成对应的控件对象,如: <layout xmlns:android="http://schemas.android.com/apk

Android Data Binding语法解析(二)

上篇我们知道了Data Binding的最简单的用法,那么Data Binding其中最为重要也是最复杂的其实就是在xml布局文件中给对应的控件进行数据绑定了,接下来就一一说明Data Binding的使用各个场景的语法. 我们以User类这个Model为例: public class User { private String userName; private String userPassword; private boolean isExist; public String getUse