zoukankan      html  css  js  c++  java
  • Android dataBinding 之 配合使用BaseAdapter适配器

    Overview

    数据绑定库与 Android Gradle 插件捆绑在一起。您无需声明对此库的依赖项,但必须启用它。
    启用的方法为:

    在我们的app/build.gradle下添加如下代码:

    android{
        dataBinding{
            enabled=true
        }
    }
    

    如何在布局文件中使用

    先是看看我们的代码:

    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android">
    
        <data>
    
            <variable
                name="user"
                type="com.example.android_databingding_learn.UserInfo" />
        </data>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#E3F2FD"
            android:orientation="vertical"
            android:paddingStart="3dp">
    
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="3dp"
                android:text="@{user.id}"
                android:textColor="@android:color/black"
                android:textSize="16sp"
                android:textStyle="bold" />
    
            <TextView
                android:id="@+id/itemLayout_txtName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="3dp"
                android:text="@{user.name}"
                android:textColor="@android:color/black"
                android:textSize="16sp"
                android:textStyle="bold" />
    
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="3dp"
                android:text="@{user.gender}"
                android:textColor="@android:color/black"
                android:textSize="16sp"
                android:textStyle="bold" />
    
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="3dp"
                android:text="@{user.age}"
                android:textColor="@android:color/black"
                android:textSize="16sp"
                android:textStyle="bold" />
        </LinearLayout>
    </layout>
    

    这样我们的layout布局文件就完成了。
    来分析一下:
    Android DataBinding layout界面解析图片
    这样我们的数据绑定等操作就完成了。

    看看我们的适配器是如何操作的

    /**
     * Date 5/3/2020
     * Author CaoJiaHao
     * Description DataBinding X BaseAdapter
     **/
    public class MainAdapter extends BaseAdapter {
        private Context mContext;
        private List<UserInfo> usersList;
    
        public MainAdapter(Context mContext, List<UserInfo> usersList) {
            this.mContext = mContext;
            this.usersList = usersList;
        }
    
        @Override
        public int getCount() {
            return usersList.size();
        }
    
        @Override
        public Object getItem(int i) {
            return usersList.get(i);
        }
    
        @Override
        public long getItemId(int i) {
            return i;
        }
    
        @Override
        public View getView(final int i, View view, ViewGroup viewGroup) {
            ItmeLayoutBinding binding;
            if (view == null) {
                binding = DataBindingUtil.inflate(LayoutInflater.from(this.mContext), R.layout.itme_layout, viewGroup, false);
                view = binding.getRoot();
                view.setTag(binding);
    
                //绑定我们的点击事件
                view.findViewById(R.id.itemLayout_txtName).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(mContext, usersList.get(i).getName(), Toast.LENGTH_SHORT).show();
                    }
                });
            } else {
                binding = (ItmeLayoutBinding) view.getTag();
            }
            binding.setVariable(BR.user, usersList.get(i));
            return view;
        }
    }
    

    这样我们的操作就完成了。来分析一下:
    Android Databinding 适配器解析一
    Android Databinding 适配器解析二
    这个就是我们的适配器代码,其他的代码和正常的适配器没有啥区别。

    如何使用这个适配器

    使用他的话就和我们使用普通的适配器是一样的。看看代码:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        List<UserInfo> usersList = new ArrayList<>();
        int a = 30;
        for (int i = 0; i < a; i++) {
            UserInfo userInfo = new UserInfo(String.valueOf(i), "GreatCoder", "Male", "17");
            usersList.add(userInfo);
        }
        ListView listview = this.findViewById(R.id.main_ListVew);
        listview.setAdapter(new MainAdapter(this, usersList));
    }
    

    就是这么的简单。看看我们的运行效果图:

    可以看到前面还有相关标识。

    如何在绑定值中进行字符串拼接

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="3dp"
        android:text='@{@string/age+user.age}'
        android:textColor="@android:color/black"
        android:textSize="16sp"
        android:textStyle="bold" />
    

    这个就是我所使用的方法。是引用string中的值。但是需要注意的是!
    不推荐!!这样去写:

    android:text='@{"年龄: "+user.age}'
    

    为啥不推荐怎么写?以为在DataBinding中如果出现错误,软件不会指向错误的地方。后期排查工作量非常的大。

    DataBinding的坑

    1. 在使用适配器的时候BR报错或者是无法找到引用名称如user。
      如何解决:
      就是注意我们的实体类的命名,名字的第一个字母需要大写。不然你就会非常的难受,别问我为啥知道。
  • 相关阅读:
    NoHttp开源Android网络框架1.0.0之架构分析
    3种浏览器性能測试
    自己定义控件-画板,橡皮擦,刮刮乐
    android优化 清除无效代码 UCDetector
    iOS推送 (百度推送)
    C#中的协变OUT和逆变
    使用反射构造对象实例并动态调用方法
    用反射获取构造函数带参数的实例对象
    自己实现一个IOC(控制翻转,DI依赖注入)容器
    func 和action 委托的使用
  • 原文地址:https://www.cnblogs.com/cao-1/p/12657802.html
Copyright © 2011-2022 走看看