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

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

自動 -- mas code center pan ppc descend 簡單應用

今天來說說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中來簡單應用一些

效果如圖:

技術分享圖片

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