android studio 30天学习笔记-day 16-databinding Recyclerview

今天会使用databinding的方式去实作一个Recyclerview。

建立model

public class DBData {
    public final ObservableField<String> name=new ObservableField<>();
    public final ObservableField<String> sex=new ObservableField<>();
    public final ObservableField<Integer> age=new ObservableField<>();
}

设置item_data_list.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="data"
            type="com.example.newtest.datadindRecyclerviewTest.DBData" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/UserName"
                android:textSize="30sp"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{data.name}"
                android:textSize="30sp"/>
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/UserSex"
                android:textSize="30sp"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{data.sex}"
                android:textSize="30sp"/>
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/UserAge"
                android:textSize="30sp"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{String.valueOf(data.age)}"
                android:textSize="30sp"/>
        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="2dp"
            android:background="@color/colorPrimary"/>
    </LinearLayout>
</layout>

这里会发现在data.age加了一个String.valueOf()data.age是int,如果不加String.valueOf()会报错。

建立adapter

public class BindRecyclerViewAdapter extends RecyclerView.Adapter<BindRecyclerViewAdapter.ViewHolder> {
    AppCompatActivity activity;
    List<DBData> dBDataList;

    public BindRecyclerViewAdapter(AppCompatActivity activity,List<DBData> dBDataList){
        this.activity=activity;
        this.dBDataList=dBDataList;

    }

    @Override
    public ViewHolder onCreateViewHolder( ViewGroup parent, int viewType) {
        LayoutInflater inflater=LayoutInflater.from(activity);
        ItemDataListBinding binding=ItemDataListBinding.inflate(inflater,parent,false);

        return new ViewHolder(binding);
    }

    @Override
    public void onBindViewHolder( ViewHolder holder, int position) { 
        DBData dbData =dBDataList.get(position);
        holder.bind(dbData);
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        ItemDataListBinding itemDataListBinding;
            public ViewHolder(ItemDataListBinding binding) {
            super(binding.getRoot());
                itemDataListBinding=binding;
        }
        void bind(DBData dbData){
            itemDataListBinding.setData(dbData);
            itemDataListBinding.executePendingBindings();
        }
    }
}

将ViewHolder的参数从view改成ItemDataListBinding,onBindViewHolder将原本用setText的方式显示UI改成bind(dbData),而在bind(dbData)记得要加executePendingBindings()executePendingBindings()会立即更新UI。

MainActivity

设定要传入的资料

    private void init() {
        recyclerView=findViewById(R.id.recyclerview1);
        for (int i=1;i<11;i++){
            DBData dBdata=new DBData();
            dBdata.name.set("eles"+i);
            dBdata.sex.set("boy");
            dBdata.age.set(i+15);
            dBDataList.add(dBdata);

        }
        bindRecyclerViewAdapter =new BindRecyclerViewAdapter(this,dBDataList);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(bindRecyclerViewAdapter);
    }

MainActivity完整程序码

public class MainActivity3 extends AppCompatActivity {
    BindRecyclerViewAdapter bindRecyclerViewAdapter;
    RecyclerView recyclerView;
    ArrayList<DBData> dBDataList=new ArrayList<>();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
        init();
    }

    private void init() {
        recyclerView=findViewById(R.id.recyclerview1);
        for (int i=1;i<11;i++){
            DBData dBdata=new DBData();
            dBdata.name.set("eles"+i);
            dBdata.sex.set("boy");
            dBdata.age.set(i+15);
            dBDataList.add(dBdata);

        }
        bindRecyclerViewAdapter =new BindRecyclerViewAdapter(this,dBDataList);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(bindRecyclerViewAdapter);
    }
}

<<:  Day 16 - 函数与物件互动3

>>:  Day-16 Pytorch 的 Training 流程

中阶魔法 - 闭包 Closure (二)

前情提要 艾草:「昨天教你原理,今天我们实际来实作这个术式吧!」 「好~~」 艾草:「来!发动前要念...

< 关於 React: 开始打地基| LifeCycle 生命圈>

09-10-2021 Mounting 当组件被初始化,第一次被放入DOM时。 ComponentD...

Day 12 Compose UI Dialog

今年的疫情蛮严重的,希望大家都过得安好,希望疫情快点过去,能回到一些线下技术聚会的时光~ 今天目标:...

[Day18] Esp32用STA mode + Relay - (程序码讲解)

1.前言 今天就不废话拉,直接进入主题(大家应该都去报复性出游了吧)。 2.html 其实HTML目...

【Day 28】- 这个验证码有点难破解(应对反爬虫技术-验证码篇)

前情提要 昨天使用了 Dcard 的 API 来爬取 Dcard 上面的文章。 开始之前 各位开始在...