文档章节

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

切切歆语
 切切歆语
发布于 2018/09/27 20:30
字数 1051
阅读 253
收藏 0

今天来说说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使用

 

 效果如图:

                  

© 著作权归作者所有

切切歆语
粉丝 23
博文 350
码字总数 237675
作品 0
杭州
程序员
私信 提问
Kotlin Weekly 中文周报 —— 102

Kotlin 开发中文周报 使用 Kotlin 高效地开发 Android App(五)完结篇 (jianshu.com) 为爬虫框架构建Selenium模块、DSL模块(Kotlin实现) (jianshu.com) 移动 Realm 到 Kotlin – Blue Apron...

DoubleThunder
2018/07/16
0
0
Android DataBinding 你好!

版权声明:本文出自阿钟的博客,转载请注明出处: https://blog.csdn.net/a_zhon/article/details/87946209 一:使用DataBinding的第一步,只需要在开启它 二:将布局文件根元素修改为 在布局...

Code-Porter
2019/02/26
0
0
一行Java代码实现RecyclerView的Adapter?一行都不需要!

单类型列表的实现 先看下MainActivity的java代码 笔者保证,除了MainActivity.java类外,不再有任何MainActivity相关的Java文件(比如MainPresenter ,MainModel , MainActivityListAdapte...

猴亮屏
2018/05/03
223
2
关于Android MvvM的一些体会

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zly921112/article/details/82849549 前言 由于我司项目较老有很多历史包袱代码结构也比较混乱,需求复杂的页...

zhuliyuan丶
2018/09/26
0
0
databinding学习(4)

RecyclerView使用Databinding (1)list_item.xml (2)实现Adapter (3)在需要使用RecyclerView的Activity布局中 注意 一定要写 全名称android.support.v7.widget.RecyclerView (4)在Activity中声......

Gemini-Lin
2015/09/22
62
0

没有更多内容

加载失败,请刷新页面

加载更多

Numpy处理图片方法

在进行图像领域的深度学习的时候经常需要对图片进行处理,包括图像的翻转,压缩,截取等,一般都是用Numpy来处理。处理起来也很方便。 In[3] # 导入需要的包 import numpy as np import matp...

北方的郎
13分钟前
7
0
AMD集中擢升高管:从Intel挖了个高手

  1 月 17 日,AMD 官方宣布多项人事升迁、新人任命,擢升了四位高级副总裁:   AMD 同时还宣布, 聘请行业资深人士 Daniel McNamara 出任高级副总裁兼服务器业务部总经理,负责在第二代...

水果黄瓜
18分钟前
4
0
什么是泛型?

一、泛型的概念 泛型是 Java SE5 出现的新特性,泛型的本质是类型参数化或参数化类型,在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型。 二、泛型的意义 一般的...

hncboy
52分钟前
7
0
dynamic-connectivity 动态连通性问题之 quick-union 算法

quick-union 的思想是:若对象 p 的 root_id 和对象 q 的 root_id 相等,则认为 p 和 q 连通。 若要将对象 p 和对象 q 连通(已知两对象未连通),则将 p 的 root_id 的值设为 q 的 root_id ...

Phpythoner_Alei
今天
51
0
OSChina 周六乱弹 —— 实在选不出来就唱国歌

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享阿冗的单曲《你的答案》。--祝大家在2020年都找到自己答案。 《你的答案》- 阿冗 手机党少年们想听歌,请使劲...

小小编辑
今天
222
6

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部