1. 程式人生 > >android -------- Data Binding的使用 ( 五 )ListView

android -------- Data Binding的使用 ( 五 )ListView

今天來說說DataBinding在列表ListView中的使用

主要分為兩種,1: 基本的實體類  2:Observable 定義欄位

listView佈局檔案

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ListView
            android:id="@+id/listview_demo7"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:dividerHeight="5dp"
            android:divider="@color/colorAccent"
            ></ListView>

    </LinearLayout>
</layout>

主要看item佈局

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <import type="com.zhangqie.databinding.demo7.UserBean" />

        <variable
            name="user"
            type="UserBean" />


        <import type="com.zhangqie.databinding.demo7.UserObservableBean" />

        <variable
            name="userObservableBean"
            type="UserObservableBean" />

    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:descendantFocusability="blocksDescendants"
        android:orientation="horizontal">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="vertical">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{`編號:` + user.userId }" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="@{`姓名:` +user.userName}" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="vertical">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{`年齡:` +user.userAge}" />

            <!--表示式判斷-->
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="@{`性別:` + (user.userSex == 1f ? `男` : `女`)}" />

        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginRight="10dp"
            android:orientation="vertical">

            <Button
                android:id="@+id/btn_update"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="修改資料" />

            <Button
                android:id="@+id/btn_delete"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="刪除資料" />
        </LinearLayout>
    </LinearLayout>
</layout>

實體類就不給了,幾個欄位就行

來看看adapter

public class ListViewAdapter extends BaseAdapter {


    private Context context;
    private List<UserBean> list;
    private LayoutInflater layoutInflater;

    public ListViewAdapter(List<UserBean> list, Context context) {
        this.list = list;
        this.context = context;
        this.layoutInflater = LayoutInflater.from(context);
    }


    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        Item7MvvmBinding item7MvvmBinding;

        if (convertView == null){
            //建立一個databinding
            item7MvvmBinding = DataBindingUtil.inflate(layoutInflater, R.layout.item7_mvvm,parent,false);
            //獲取convertView
            convertView = item7MvvmBinding.getRoot();
        }else {
            //  //去除convertView中bangding的dataBinding
            item7MvvmBinding = DataBindingUtil.getBinding(convertView);
        }
        UserBean userBean = list.get(position);
        //繫結資料,這裡的BR.user根據item佈局檔案中的變數宣告來決定
        item7MvvmBinding.setVariable(com.zhangqie.databinding.BR.user,userBean);
        item7MvvmBinding.btnUpdate.setOnClickListener(new OnBtnClickListener(1, userBean));
        item7MvvmBinding.btnDelete.setOnClickListener(new OnBtnClickListener(2, position));
        return convertView;//也可以直接item7MvvmBinding.getRoot()也行
    }


    public class OnBtnClickListener implements View.OnClickListener{

        private int stats;//1,修改;2,刪除
        private UserBean userBean;
        private int position;

        public OnBtnClickListener(int stats,UserBean userBean){
            this.stats = stats;
            this.userBean = userBean;
        }
        public OnBtnClickListener(int stats, int position) {
            this.stats = stats;
            this.position = position;
        }

        @Override
        public void onClick(View view) {
            switch (stats){
                case 1:
                    userBean.setUserName("修改後的名字");
                    Toast.makeText(context,"1",Toast.LENGTH_LONG).show();
                    notifyDataSetChanged();//重新整理資料
                    break;
                case 2:
                    list.remove(position);
                    notifyDataSetChanged();
                    break;
            }
        }
    }
}

activity中

public class Demo7 extends AppCompatActivity {

    Demo7Binding demo7Binding;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        demo7Binding = DataBindingUtil.setContentView(this, R.layout.demo7);
        initView();
    }

    private void initView(){
        ListViewAdapter listViewAdapter = new ListViewAdapter(initData(),this);
        //demo7Binding.listviewDemo7.setAdapter(listViewAdapter);
     
        //這是第二種
        ListViewObservableAdapter listViewObservableAdapter = new ListViewObservableAdapter(initObservableData(),this);
        demo7Binding.listviewDemo7.setAdapter(listViewObservableAdapter);

        listViewAdapter.notifyDataSetChanged();
    }

    //初始化測試資料
    private List<UserBean> initData() {
        List<UserBean> list = new ArrayList<>();
        for (int i = 1; i < 16; i++) {
            UserBean userBean = new UserBean();
            userBean.setUserId(i);
            userBean.setUserName("切切心語"+i);
            userBean.setUserAge(18 + i);
            userBean.setUserSex(i % 2 == 0 ? 1 : 0);
            list.add(userBean);
        }
        return list;
    }

    //初始化測試資料
    private List<UserObservableBean> initObservableData() {
        List<UserObservableBean> list = new ArrayList<>();
        for (int i = 1; i < 16; i++) {
            UserObservableBean userBean = new UserObservableBean();
            userBean.userId.set(i);
            userBean.userName.set("切切心語"+i);
            userBean.userAge.set(18 + i);
            userBean.userSex.set(i % 2 == 0 ? 1 : 0);
            list.add(userBean);
        }
        return list;
    }

}

上面adapter主要是第一種方式

第二種adapter如下:

public class ListViewObservableAdapter extends BaseAdapter {

    private Context context;
    private List<UserObservableBean> list;
    private LayoutInflater layoutInflater;

    public ListViewObservableAdapter(List<UserObservableBean> list, Context context) {
        this.list = list;
        this.context = context;
        this.layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        Item7MvvmBinding item7MvvmBinding;

        if (convertView == null) {
            //建立一個databinding
            item7MvvmBinding = DataBindingUtil.inflate(layoutInflater, R.layout.item7_mvvm, parent, false);
            //獲取convertView
            convertView = item7MvvmBinding.getRoot();
        } else {
            //  //去除convertView中bangding的dataBinding
            item7MvvmBinding = DataBindingUtil.getBinding(convertView);
        }
        UserObservableBean userBean = list.get(position);
        //繫結資料,這裡的BR.user根據item佈局檔案中的變數宣告來決定
        item7MvvmBinding.setVariable(com.zhangqie.databinding.BR.userObservableBean, userBean);
        item7MvvmBinding.btnUpdate.setOnClickListener(new OnBtnClickListener(1, userBean));
        item7MvvmBinding.btnDelete.setOnClickListener(new OnBtnClickListener(2, position));
        return convertView;//也可以直接item7MvvmBinding.getRoot()也行
    }

    public class OnBtnClickListener implements View.OnClickListener {
        private int stats;//1,修改;2,刪除
        private UserObservableBean userBean;
        private int position;

        public OnBtnClickListener(int stats, UserObservableBean userBean) {
            this.stats = stats;
            this.userBean = userBean;
        }

        public OnBtnClickListener(int stats, int position) {
            this.stats = stats;
            this.position = position;
        }

        @Override
        public void onClick(View view) {
            switch (stats) {
                case 1:
                    userBean.userName.set("修改後的名字");//自動更新資料
                    break;
                case 2:
                    list.remove(position);
                    notifyDataSetChanged();
                    break;
            }
        }
    }
}

把前面講的Observable 結合到ListView中來簡單應用一些

效果如圖: