澳门威利斯人_威利斯人娱乐「手机版」

来自 办公软件 2020-03-12 03:51 的文章
当前位置: 澳门威利斯人 > 办公软件 > 正文

适配器基类封装

作为几个android 开垦者,心里仿佛对RecyclerView又爱又恨,爱的是它对列表数据管理效果够有力,恨得是要写adapter 和 viewholder ,虽然说写adapter 和 viewholder倒不是难,而是烦,千遍一率的貌似代码,对于技术员来讲,重复是最令人讨厌的。所以那才有诸有此类多仁人志士,前俯后继地举行通用型,万能型 adapter 的架空。纵然已经有过多的通用性、万能型adapter适配器,但是本人在那照旧要讲下Databinding对adapter(RecyclerViewState of Qatar适配器基类封装。

阅读本篇文章须求读者对Android Databinding和RecyclerView有一定的精晓。

DataBinding的核心观念是数量驱动。数据驱动驱动的指标便是View,使用DataBinding,我们透过增加、纠正、删除数据源,View就能自动付与相关更换,到达一种双向绑定的职能。也正是说Databinding现身的意思就在于系统活动辅助大家生成Data和View之间的connection.而在Adapter中现身的ViewHolder就是大家手动生成的connection,下边大家就来看看databinding怎样简练对应的adapter。

简介

我们领会,DataBinding的核激情念是数量驱动。数据驱动驱动的目的正是View,使用DataBinding,大家因而增添、订正、删除数据源,View就能自行付与相关改动。

Android RecyclerView的Adapter起的效果与利益就是三番两次数据和View

一个最简便的RecyclerView Adapter大概是上面这些样子的:

public class UserAdapter extends RecyclerView.Adapter
{
    @Override
    public int getItemCount()
    {
        return 0;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {

    }
}

通过getItemsCount(), RecyclerView知道了有着子项的数据。

通过onCreateViewHolder(), RecyclerView知道了每二个子项长什么体统。

通过onBindViewHolder(),让各种子项得以突显正确的多少。

能够见见,Adapter起的法力和DataBinding是不行周边的,使用DataBinding,可以使Adapter的编撰显得越发简约。

  1. 威尼斯国际娱乐,下边先看看二个简易的RecyclerView Adapter代码:

DataBinding轻易利用

接下去看八个简洁明了的例子。那个例子创设了叁个简单易行的列表,效果如下:

威尼斯国际娱乐 1

我们看看,使用DataBinding该怎么促成它。

Model类:

public class User
{
    private String name;
    private int age;

    public User(String name, int age)
    {
        this.name = name;
        this.age = age;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public int getAge()
    {
        return age;
    }

    public void setAge(int age)
    {
        this.age = age;
    }
}
public class UserAdapter extends RecyclerView.Adapter { @Override public int getItemCount() { return 0; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { } }

View xml

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <data>
        <import type="cn.zmy.databindingadapter.model.User"/>
        <variable name="model"
                  type="User"/>
    </data>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="60dp"
                  android:layout_marginBottom="10dp"
                  android:background="@android:color/darker_gray"
                  android:gravity="center_vertical"
                  android:orientation="vertical">
        <TextView android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="@{model.name}"/>
        <TextView android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="@{String.valueOf(model.age)}"/>
    </LinearLayout>
</layout>
  • 透过getItemsCount(卡塔尔(قطر‎, RecyclerView知道了具备子项的数目。

  • 经过onCreateViewHolder(State of Qatar, RecyclerView知道了每一个子项长什么样子。

  • 经过onBindViewHolder(卡塔尔(قطر‎,让每种子项得以展现精确的数目。

Adapter

public class UserAdapter extends RecyclerView.Adapter
{
    private Context context;
    private List<User> items;

    public UserAdapter(Context context)
    {
        this.context = context;
        this.items = new ArrayList<User>()
        {{
            add(new User("张三", 18));
            add(new User("李四", 28));
            add(new User("王五", 38));
        }};
    }

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

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        ItemUserBinding binding = DataBindingUtil.inflate(LayoutInflater.from(this.context), R.layout.item_user, parent, false);
        return new UserViewHolder(binding.getRoot());
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        ItemUserBinding binding = DataBindingUtil.getBinding(holder.itemView);
        binding.setModel(this.items.get(position));
        binding.executePendingBindings();
    }

    static class UserViewHolder extends RecyclerView.ViewHolder
    {
        public UserViewHolder(View itemView)
        {
            super(itemView);
        }
    }
}

能够看来,艾达pter起的意义和DataBinding是那多少个周边的,使用DataBinding,能够使Adapter的编辑显得愈发简明。

Activity

public class MainActivity extends AppCompatActivity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(new UserAdapter(this));
    }
}

能够看到,使用了DataBinding之后,我们在onBindViewHolder中,无需再写一些好像于holder.view.setXXX()的代码,因为那些在Xml中就已经到位了。

  1. 上面看看使用DataBinding编写的adapter:

优化

上面的Adapter还能够不可能更简便吗?

adapter基础类:

优化ViewHolder

笔者们开掘,Adapter中的UserViewHolder差了一些从不做此外交事务。事实上,大家表明它完全都以由于AdapteronCreateViewHolder供给如此叁个再次回到值。

咱俩得以把ViewHolder建议来,那样具备Adapter都得以利用而不须要在各类Adapter中都扬言三个ViewHolder。

命名就叫BaseBindingViewHolder

public class BaseBindingViewHolder extends RecyclerView.ViewHolder
{
    public BaseBindingViewHolder(View itemView)
    {
        super(itemView);
    }
}

本文由澳门威利斯人发布于办公软件,转载请注明出处:适配器基类封装

关键词: 澳门威利斯人 所有随笔 Android 适配器 Databinding