DataBinding(数据绑定)基础讲解
DataBinding(数据绑定)基础讲解_jianning-wu的博客-CSDN博客
本章节讲述ListView中使用DataBinding。
一.ListView使用Databinding
Item布局
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="stu"
type="com.wjn.okhttpmvpdemo.databinding.Student" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/databindinglibrarylistview_item_name"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text="@{stu.name}" />
<TextView
android:id="@+id/databindinglibrarylistview_age"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_below="@id/databindinglibrarylistview_item_name"
android:gravity="center"
android:text="@{stu.age}" />
<TextView
android:id="@+id/databindinglibrarylistview_sex"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_below="@+id/databindinglibrarylistview_age"
android:gravity="center"
android:text="@{stu.sex}" />
</RelativeLayout>
</layout>
Adapter
package com.wjn.okhttpmvpdemo.databinding;
import android.content.Context;
import android.databinding.DataBindingUtil;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.wjn.okhttpmvpdemo.R;
import java.util.List;
public class UserListAdapter extends BaseAdapter {
private Context context;
private List<Student> list;
public UserListAdapter(Context context, List<Student> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ListviewItemBinding listviewItemBinding;
if (null == convertView) {
listviewItemBinding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.listview_item, parent, false);
convertView = listviewItemBinding.getRoot();//获取布局
convertView.setTag(listviewItemBinding);
} else {
listviewItemBinding = (ListviewItemBinding) convertView.getTag();
}
//绑定数据
Student student = list.get(position);
listviewItemBinding.setStu(student);
return convertView;
}
}
Activity使用
package com.wjn.okhttpmvpdemo.databinding;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;
import com.wjn.okhttpmvpdemo.R;
import java.util.ArrayList;
import java.util.List;
public class UserListActivity extends AppCompatActivity {
private ListView listview;
private UserListAdapter adapter;
private List<Student> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_list);
initData();
}
/**
* 赋值
*/
private void initData() {
list = new ArrayList<>();
Student student1 = new Student();
student1.setName("小红");
student1.setAge("22");
student1.setSex("女");
Student student2 = new Student();
student2.setName("张三");
student2.setAge("24");
student2.setSex("男");
Student student3 = new Student();
student3.setName("小丽");
student3.setAge("20");
student3.setSex("女");
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student1);
list.add(student2);
list.add(student3);
listview = findViewById(R.id.listview);
adapter = new UserListAdapter(this, list);
listview.setAdapter(adapter);
}
}
结果
修改Adapter 添加 ViewHolder
新Adapter
package com.wjn.okhttpmvpdemo.databinding;
import android.content.Context;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.wjn.okhttpmvpdemo.R;
import java.util.List;
public class UserListAdapter extends BaseAdapter {
private Context context;
private List<Student> list;
public UserListAdapter(Context context, List<Student> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
ListviewItemBinding listviewItemBinding;
if (null == convertView) {
viewHolder = new ViewHolder();
listviewItemBinding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.listview_item, parent, false);
convertView = listviewItemBinding.getRoot();//获取布局
viewHolder.setItemCoinsDetailBinding(listviewItemBinding);//缓存binding到holder
convertView.setTag(viewHolder);//设置Tag
} else {
viewHolder = (ViewHolder) convertView.getTag();
listviewItemBinding = (ListviewItemBinding) viewHolder.getItemCoinsDetailBinding();
}
//绑定数据
Student student = list.get(position);
listviewItemBinding.setStu(student);
return convertView;
}
/**
* ViewHolder类 使用ViewDataBinding
*/
private static class ViewHolder {
private ViewDataBinding itemCoinsDetailBinding;
public void setItemCoinsDetailBinding(ViewDataBinding itemCoinsDetailBinding) {
this.itemCoinsDetailBinding = itemCoinsDetailBinding;
}
public ViewDataBinding getItemCoinsDetailBinding() {
return itemCoinsDetailBinding;
}
}
}
结果
二.ListView中绑定ImageView
item布局
<?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>
<variable
name="stu"
type="com.wjn.okhttpmvpdemo.databinding.Student" />
<variable
name="imageUrl"
type="String" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/listview_item_imageview"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_alignParentTop="true"
android:layout_centerInParent="true"
app:image="@{imageUrl}" />
<TextView
android:id="@+id/listview_item_name"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_below="@+id/listview_item_imageview"
android:gravity="center"
android:text="@{stu.name}" />
</RelativeLayout>
</layout>
图片显示工具类
package com.wjn.okhttpmvpdemo.databinding;
import android.databinding.BindingAdapter;
import android.util.Log;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
public class ImageUtil {
/**
* 方法一定是静态的 两个参数
*/
@BindingAdapter({"bind:image"})
public static void imageLoader(ImageView imageView, String url) {
Glide.with(imageView.getContext()).load(url).into(imageView);
Log.d("TAG", "url----:" + url);
}
}
Adapter
package com.wjn.okhttpmvpdemo.databinding;
import android.content.Context;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.wjn.okhttpmvpdemo.R;
import java.util.List;
public class PictureListAdapter extends BaseAdapter {
private Context context;
private List<Student> list;
public PictureListAdapter(Context context, List<Student> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
PicturelistviewItemBinding picturelistviewItemBinding;
if (null == convertView) {
viewHolder = new ViewHolder();
picturelistviewItemBinding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.picturelistview_item, parent, false);
convertView = picturelistviewItemBinding.getRoot();//获取布局
viewHolder.setItemCoinsDetailBinding(picturelistviewItemBinding);//缓存binding到holder
convertView.setTag(viewHolder);//设置Tag
} else {
viewHolder = (ViewHolder) convertView.getTag();
picturelistviewItemBinding = (PicturelistviewItemBinding) viewHolder.getItemCoinsDetailBinding();
}
//绑定数据
Student student = list.get(position);
picturelistviewItemBinding.setStu(student);
String ava = list.get(position).getAva();
picturelistviewItemBinding.setImageUrl(ava);
return convertView;
}
/**
* ViewHolder类 使用ViewDataBinding
*/
private static class ViewHolder {
private ViewDataBinding itemCoinsDetailBinding;
public void setItemCoinsDetailBinding(ViewDataBinding itemCoinsDetailBinding) {
this.itemCoinsDetailBinding = itemCoinsDetailBinding;
}
public ViewDataBinding getItemCoinsDetailBinding() {
return itemCoinsDetailBinding;
}
}
}
Activity使用
package com.wjn.okhttpmvpdemo.databinding;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import com.wjn.okhttpmvpdemo.R;
import java.util.ArrayList;
import java.util.List;
public class PictureListActivity extends AppCompatActivity {
private ListView listview;
private PictureListAdapter adapter;
private List<Student> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_picture_list);
initData();
}
/**
* 赋值
*/
private void initData() {
list = new ArrayList<>();
Student student1 = new Student();
student1.setName("小红");
student1.setAva("");
Student student2 = new Student();
student2.setName("张三");
student2.setAva("");
Student student3 = new Student();
student3.setName("小丽");
student3.setAva("");
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student1);
list.add(student2);
list.add(student3);
listview = findViewById(R.id.listview);
adapter = new PictureListAdapter(this, list);
listview.setAdapter(adapter);
}
}