android data binding jetpack VIII BindingConversion

android data binding jetpack VII @BindingAdapter

android data binding jetpack V 实现recyclerview 绑定

android data binding jetpack IV 绑定一个方法另一种写法和参数传递

android data binding jetpack III 绑定一个方法

android data binding jetpack II 动态数据更新

android data binding jetpack I 环境配置 model-view 简单绑定

来实现一个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" />

android data binding jetpack V 实现recyclerview 绑定的更多相关文章

  1. android data binding jetpack IV 绑定一个方法另一种写法和参数传递

    android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...

  2. android data binding jetpack I 环境配置 model-view 简单绑定

    android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...

  3. android data binding jetpack VIII BindingConversion

    android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...

  4. android data binding jetpack VII @BindingAdapter

    android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...

  5. android data binding jetpack VI 清理一些概念。BR 运算表达式

    android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...

  6. android data binding jetpack II 动态数据更新

    android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...

  7. android data binding jetpack III 绑定一个方法

    第三篇 给view绑定一下方法响应. (补充:1.被绑定的方法必须是public的.   1.绑定方法可以用主语法.也可以用以下双冒号方式“::” android:onClick="@{pr ...

  8. android data binding jetpack VIIII 第一坑

    <LinearLayout android:id="@+id/ll_item_home_page_pics" android:layout_width="wrap_ ...

  9. Android开发教程 - 使用Data Binding(六)RecyclerView Adapter中的使用

    本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...

随机推荐

  1. vue 项目中如何在页面刷新的状态下保留数据

    1.问题:在vue项目中,刷新页面之后,我当前打开的所有菜单,都消失,我如何实现刷新之后页面仍然是刷新之前的状态 效果图: 解决方法: 使用vuex作状态管理: 将vuex里面的数据同步更新到loca ...

  2. 【0】Zookeeper Q&A

    1.Observer角色如何配置? Zookeeper集群中的中的Leader和Follower角色是由服务器启动时期的Leader选举产生的,Observer不参与选举,此角色的节点需要在配置文件z ...

  3. Mount Windows (CIFS) shares on Linux with credentials in a secure way

      Posted on 09/09/2014 In almost all cases, when mounting a CIFS-share on a Linux host, you will nee ...

  4. 【转】Linux设置和查看环境变量的方法

    转: http://www.jb51.net/LINUXjishu/77524.html 1. 显示环境变量HOME $ echo $HOME /home/redbooks 2. 设置一个新的环境变量 ...

  5. 【转】草根老师的 linux字符设备驱动详解

    Linux 驱动 之 模块化编程 Linux 驱动之模块参数和符号导出 Linux 设备驱动之字符设备(一) Linux 设备驱动之字符设备(二) Linux 设备驱动之字符设备(三)

  6. ora-01847:月份中日的值必须介于 1 和当月最后一日之间

    今天解决了一个奇葩问题: ORA-01847: 月份中日的值必须介于 1 和当月最后一日之间 将数据从一个视图倒入到一个同结构的表中,但是老报错,也就那么几个字段,肉眼真看不出来什么问题,但是既然报这 ...

  7. Codeforces 1082 毛毛虫图构造&最大权闭合子图

    A #include<bits/stdc++.h> using namespace std; typedef long long ll; , MAXM = ; //int to[MAXM ...

  8. 平衡搜索树-B树。

    B Tree 系列 摘录: https://blog.csdn.net/v_JULY_v/article/details/6530142 B+树介绍 B+树的几点介绍 动态查找树有: 二叉查找树,自平 ...

  9. Cloneable测试

    一.Cloneable 的用途   Cloneable和Serializable一样都是标记型接口,它们内部都没有方法和属性,implements Cloneable表示该对象能被克隆,能使用Obje ...

  10. C# class 浅拷贝 与 深拷贝

    MemberwiseClone 方法创建一个浅表副本,具体来说就是创建一个新对象,然后将当前对象的非静态字段复制到该新对象.如果字段是值类型的,则对该字段执行逐位复制.如果字段是引用类型,则复制引用但 ...