android data binding jetpack V

来实现一个recyclerview绑定。

看了例子理一下思路。

第一个关系:

item 与itemview 数据与展示绑定。

recyclerview 更新数据和UI过程是:获取holder类型->产生holder->获取holder()->holder+data->展示。

代码在adapter中执行。

1.获取某个位置的holder类型。

 @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

2.创建holder

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

3.绑定数据并展示出来。

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

    }

现在使mvvm 那么

第一步:在createholder的时候要确定 binding 与xml的绑定关系。

第二步:在onBindViewHolder中让关系实现并展示。

看示例代码怎么实现第一步

  @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {     //读取xml对内存
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        //建立绑定关系     ViewDataBinding binding = DataBindingUtil.inflate(inflater, layoutId, parent, false);
        //建立一下holder     ViewHolder viewHolder = new ViewHolder(binding.getRoot());
        //把绑定关系记录在holder的变量里。     viewHolder.setBinding(binding);
        return viewHolder;
    }
 @Override
    public void onBindViewHolder(ViewHolder holder, int position) {     //执行绑定,给绑定关系设置数据。
        holder.getBinding().setVariable(brId,mDatas.get(position));     //让绑定生效。
        holder.getBinding().executePendingBindings();
    }
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <import type="com.ht.jetpack.model.Student" />

        <variable
            name="student"
            type="Student" />
    </data>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center">

        <ImageView
            android:layout_width="280dp"
            android:layout_height="210dp"
            android:layout_margin="10dp"
            android:scaleType="centerCrop"
            app:studentAvatar="@{student.resId}" />

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="40dp"
            android:gravity="center"
            android:text="@{student.name}"
            android:textSize="18sp" />

    </LinearLayout>
</layout>

xml是绑定关系。

整个过程:加xml->产生绑定关->滚动到某个位置->获取绑定关系,给绑定加入数据->展示

声明的变量:

给变量赋值:

brId是

就是xml里声明的模型变量。

难点:

这个之前没有见过。自定义了一个属性,进行了绑定。

具定实现在这儿:

这个需要求单独一下块内容去学习。

看一下运行效果:

以下是实例代码:要运行请自己找几张图加到drawable里命名一致就可以了。

package com.ht.jetpack.adapter;

import android.databinding.BindingAdapter;
import android.widget.ImageView;

public class BindingUtil {

    @BindingAdapter("bind:studentAvatar")
    public static void showImageByUrl(final ImageView imageView, int resId) {
        imageView.setImageResource(resId);
    }
}
package com.ht.jetpack.adapter;

import android.content.Context;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;

public class InitRecyclerView {

    public static void initLinearLayoutVERTICAL(Context context, RecyclerView recyclerView) {
        LinearLayoutManager layoutManager = new LinearLayoutManager(context);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
    }

    public static void initLinearLayoutWithoutDivid(Context context, RecyclerView recyclerView) {
        LinearLayoutManager layoutManager = new LinearLayoutManager(context);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
    }

    public static void initLinearLayoutHorizontal(Context context, RecyclerView recyclerView) {
        LinearLayoutManager layoutManager = new LinearLayoutManager(context);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
    }

    public static void initStaggered(Context context, RecyclerView recyclerView) {
        StaggeredGridLayoutManager sgm = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(sgm);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
    }
}
package com.ht.jetpack.adapter;

import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;

import java.util.List;

/**
 * Created by hongtao
 */
public class MySimpleAdapter<T> extends RecyclerView.Adapter<ViewHolder>{

    private List<T> mDatas;

    private int layoutId;

    private int brId;

    public MySimpleAdapter(List<T> mDatas, int layoutId, int brId) {
        this.mDatas = mDatas;
        this.layoutId = layoutId;
        this.brId = brId;
    }

    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        ViewDataBinding binding = DataBindingUtil.inflate(inflater, layoutId, parent, false);
        ViewHolder viewHolder = new ViewHolder(binding.getRoot());
        viewHolder.setBinding(binding);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.getBinding().setVariable(brId,mDatas.get(position));
        holder.getBinding().executePendingBindings();
    }

    @Override
    public int getItemCount() {
        return mDatas == null ? 0 : mDatas.size();
    }
}
package com.ht.jetpack.adapter;

import android.databinding.ViewDataBinding;
import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
 * Created by hongtao .
 */
public class ViewHolder extends RecyclerView.ViewHolder {

    private ViewDataBinding binding;

    public ViewDataBinding getBinding() {
        return binding;
    }

    public void setBinding(ViewDataBinding binding) {
        this.binding = binding;
    }

    public ViewHolder(View itemView) {
        super(itemView);
    }
}
   RecyclerView recyclerView = (RecyclerView) findViewById(R.id.show_list);

        InitRecyclerView.initLinearLayoutWithoutDivid(this, recyclerView);
        List<Student> students = new ArrayList<>();
        Student student = new Student(R.drawable.tx2, "Kate");
        students.add(student);
        student = new Student(R.drawable.tx3, "tom");
        students.add(student);
        student = new Student(R.drawable.tx4, "Johnson");
        students.add(student);
        student = new Student(R.drawable.tx5, "Make");
        students.add(student);

        MySimpleAdapter<Student> adapter = new MySimpleAdapter<>(students, R.layout.student_item, BR.student);
        recyclerView.setAdapter(adapter);
在main layout里声明    <android.support.v7.widget.RecyclerView
            android:id="@+id/show_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@+id/navigation"
            android:layout_below="@id/tv"
            android:scrollbars="vertical" />

原文地址:https://www.cnblogs.com/mamamia/p/10101214.html

时间: 2024-10-02 01:29:55

android data binding jetpack V的相关文章

android data binding jetpack VIIII 第一坑

<LinearLayout android:id="@+id/ll_item_home_page_pics" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/rl_item_home_page_top" android:layout_marginTop="10d

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 技术

Android Data Binding 技术

Android Data Binding实战(一)

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

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 系列(二) -- 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高级用法-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的使用 RecyclerView

今天来说说DataBinding在列表RecyclerView中的使用 列表绑定 App中经常用到列表展示,Data Binding在列表中一样可以扮演重要的作用,直接绑定数据和事件到每一个列表的item. RecyclerView 过去我们往往会使用ListView.GridView.或者GitHub上一些自定义的View来做瀑布流.自从RecyclerView出现后,我们有了新选择,只需要使用LayoutManager就可以. RecyclerView内置的垃圾回收,ViewHolder.I