android -------- Data Binding的使用 ( 五 )ListView
阿新 • • 發佈:2018-12-09
今天來說說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中來簡單應用一些
效果如圖: