天天看點

Android官方DataBinding(三):RecyclerView 使用ViewDataBinding更新資料

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 

繼續閱讀