Android官方DataBinding(三):RecyclerView 使用ViewDataBinding更新資料
本例基于Android官方DataBinding,在RecyclerView上實作一個簡單需求:點選一個button按鈕,增加一個資料元素,并更新的view上。
(1)首先寫一個布局,這個布局上面放一個按鈕button,下面一個标準Android RecyclerView。Button按鈕的實作一個簡單的功能:沒點選一次就增加一個資料元素,然後更新到RecyclerView。recycler_view_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加元素" />
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
(2)和附錄文章1,2,寫資料模型User,對比這個User和附錄1,2的User模組化時候的異同,User.java:
package zhangphil.test;
import android.databinding.BaseObservable;
//import android.databinding.Bindable;
/**
* Created by Phil on 2017/8/17.
*/
public class User extends BaseObservable {
private String id;
private String name;
private String blog;
public void setId(String id) {
this.id = id;
//notifyPropertyChanged(BR.id);
}
//@Bindable
public String getId() {
return this.id;
}
public void setName(String name) {
this.name = name;
//notifyPropertyChanged(BR.name);
}
//@Bindable
public String getName() {
return this.name;
}
public void setBlog(String blog) {
this.blog = blog;
//notifyPropertyChanged(BR.blog);
}
//@Bindable
public String getBlog() {
return this.blog;
}
}
(3)因為是一個RecyclerView,RecyclerView需要Adapter,在Adapter中需要一個布局layout,為User的資料找到View,Adapter需要的子view布局這裡将寫View和Model的綁定代碼,item.xml:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="zhangphil.test.User" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.id}"
android:textColor="@android:color/holo_red_light" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"
android:textColor="@android:color/holo_red_light" />
<TextView
android:id="@+id/blog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.blog}"
android:textColor="@android:color/holo_red_light" />
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@android:color/holo_blue_bright" />
</LinearLayout>
</layout>
(4)上層Java代碼,注意觀察ViewHolder的寫法。比較關鍵的是在建立ViewHolder時候傳入的ViewDataBinding。在Adapter的onBindViewHolder裡面,僅需兩行代碼就實作資料模型和View的綁定,MainActivity.java:
package zhangphil.test;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import static zhangphil.test.BR.user;
public class MainActivity extends AppCompatActivity {
private int index = 0;
private ItemAdapter mItemAdapter;
private ArrayList<User> mItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recycler_view_layout);
mItems = new ArrayList();
for (int i = 0; i < 1; i++) {
User u = new User();
u.setId(index + "");
u.setName("zhangphil @" + index);
u.setBlog("blog.csdn.net/zhangphil @" + index);
mItems.add(u);
index++;
}
RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
mItemAdapter = new ItemAdapter();
mRecyclerView.setAdapter(mItemAdapter);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
User u = new User();
u.setId(index + "");
u.setName("zhangphil @" + index);
u.setBlog("blog.csdn.net/zhangphil @" + index);
mItems.add(u);
mItemAdapter.notifyDataSetChanged();
index++;
}
});
}
private class ItemAdapter extends RecyclerView.Adapter<ItemViewHolder> {
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), R.layout.item, viewGroup, false);
ItemViewHolder holder = new ItemViewHolder(binding);
return holder;
}
@Override
public void onBindViewHolder(ItemViewHolder viewHolder, int i) {
viewHolder.getBinding().setVariable(user, mItems.get(i));
viewHolder.getBinding().executePendingBindings();
}
@Override
public int getItemCount() {
return mItems.size();
}
}
private class ItemViewHolder extends RecyclerView.ViewHolder {
private ViewDataBinding binding;
public ItemViewHolder(ViewDataBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
public void setBinding(ViewDataBinding binding) {
this.binding = binding;
}
public ViewDataBinding getBinding() {
return this.binding;
}
}
}
代碼運作結果,每點選一次button,資料增加一個,更新:
附錄:
1,《Android官方DataBinding簡例(一)》連結:http://blog.csdn.net/zhangphil/article/details/77322530
2,《Android官方DataBinding(二):動态資料更新notifyPropertyChanged》連結:http://blog.csdn.net/zhangphil/article/details/77328688