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中来简单应用一些

 

效果如图:

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

 

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

上一篇:APP线上问题收集信息整理


下一篇:css背景图片加载失败,页面部分图标无法显示