1. 程式人生 > >android MVVM開發框架——(2)DataBinding 應用於ListView

android MVVM開發框架——(2)DataBinding 應用於ListView

1,listview佈局

<?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>
        <!--引用自定義的介面卡listviewadapter-->
        <import type="com.lh.mvvm.adapter.ListViewAdapter"
/>
<variable name="adapter" type="ListViewAdapter" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!--將介面卡繫結到listview-->
<ListView android:layout_width="match_parent" android:layout_height="match_parent" app:adapter="@{adapter}" /> </LinearLayout> </layout>

注意,這裡面有個自定義的adapter,這裡先把佈局寫出來,adapter後面再寫

2,item佈局

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <!--這裡沿用雙向繫結的userbean--> <import type="com.lh.mvvm.observable.UserBean" /> <import alias="mUtils" type="com.lh.mvvm.utils.MvvmUtils" /> <variable name="user" type="UserBean" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:descendantFocusability="blocksDescendants" android:orientation="horizontal"> <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:text="@{`姓名:` +user.userName}" /> <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:text="@{`性別:` +mUtils.getUserSex(user.userSex)}" /> <!--一定要使用1f而不能是使用1 ,型別必須相對應--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`性別:` + (user.userSex == 1f ? `男` : `女`)}" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0.1" 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:text="刪除資料" /> </LinearLayout> </LinearLayout> </layout>

3,自定義adapter

public class ListViewAdapter extends BaseAdapter {
    //資料
    private List<UserBean> list;

    public ListViewAdapter(List<UserBean> list) {
        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) {
        //這個databinding也是根據佈局檔案item_mvvm而命名的
        ItemMvvmBinding itemMvvmBinding;
        if (convertView == null) {
            //建立一個databinding
            itemMvvmBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_mvvm, parent, false);
            //獲取convertView
            convertView = itemMvvmBinding.getRoot();
        } else {
            //去除convertView中bangding的dataBinding
            itemMvvmBinding = DataBindingUtil.getBinding(convertView);
        }
        UserBean userBean = list.get(position);
        //繫結資料,這裡的BR.user根據item佈局檔案中的變數宣告來決定
        itemMvvmBinding.setVariable(BR.user, userBean);
        itemMvvmBinding.btnUpdate.setOnClickListener(new OnBtnClickListener(1, userBean));
        itemMvvmBinding.btnDelete.setOnClickListener(new OnBtnClickListener(2, position));
        return convertView;
    }

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

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

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

        @Override
        public void onClick(View v) {
            switch (stats) {
                case 1:
                    userBean.userName.set("修改後的名字");
                    break;
                case 2:
                    list.remove(position);
                    notifyDataSetChanged();
                    break;
            }
        }
    }
}

可以看出,這裡並沒有重用view的程式碼了,這就是mvvm中的一大好處

4,activity執行

public class ListViewActivity extends Activity {

    //相對應xml佈局檔名
    ActivityListViewBinding activityListViewBinding;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        activityListViewBinding = DataBindingUtil.setContentView(this, R.layout.activity_list_view);
        //初始化一個listview的adapter
        ListViewAdapter listViewAdapter = new ListViewAdapter(initData());
        //繫結adapter
        activityListViewBinding.setAdapter(listViewAdapter);
        //通知adapter重新整理資料
        listViewAdapter.notifyDataSetChanged();
    }

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

listview與databinding的使用基本就是這樣,一些更復雜的功能可以在此基礎上繼續深入研究