注意: 本篇中的代码为实际工程代码,作为个人的代码笔记并非纯粹demo.,读者参考大概思路即可。
很简单,依然采用传统的ListView + Adapter的方式,只是Adapter中的item使用DataBinding来实现。
fragment需求如下:
并且list中的item可根据需求设置动态隐藏/显示。
fragment文件代码:
public class BCFragment extends BaseFragment {
public static final String DATA_LIST = "BCFragment_data_list";
private FragmentBCBinding mBinding;
private View mView;
//详细信息列表
private List<DetailInfo> detailInfoList;
private BCAdapter mListAdapter;
public static BCFragment instance(List<DetailInfo> goodsInfo) {
BCFragment fragment = new BCFragment();
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(BCFragment.DATA_LIST, (ArrayList<DetailInfo>) goodsInfo);
fragment.setArguments(bundle);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (null == mView) {
mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_bc, container, false);
mView = mBinding.getRoot();
mBinding.setView(this);
}
return mView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
init();
}
private void init() {
detailInfoList = getArguments().getParcelableArrayList(BCFragment.DATA_LIST);
mListAdapter = new BCAdapter(getActivity(), detailInfoList);
mBinding.goodsList.setAdapter(mListAdapter);
mBinding.goodsList.setOnItemClickListener(
new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mListAdapter.checkItem(position);
if (mListAdapter.getCheckedItemNum() == mListAdapter.getVisibleItemNum()) {
mBinding.chooseAllItems.setChecked(true);
} else {
mBinding.chooseAllItems.setChecked(false);
}
mListAdapter.notifyDataSetChanged();
}
}
);
}
/**
* 选择全部
*
* @param view
*/
public void chooseAllItems(View view) {
if (mBinding.chooseAllItems.isChecked()) {
mListAdapter.checkAll();
} else {
mListAdapter.clearAll();
}
refreshRightView();
}
/**
* 选择按钮
*
* @param view
*/
public void clickChoose(View view) {
if (mListAdapter.getCheckedItemNum() == 0) {
showConfirmError("请至少选择一项!");
return;
}
ArrayList<DetailInfo> chooseList = new ArrayList<>();
for (int i = 0; i < mListAdapter.getCount(); i++) {
if (mListAdapter.getmDataList().get(i).isVisible() && mListAdapter.getmDataList().get(i).isChecked()) {
chooseList.add(new DetailInfo(mListAdapter.getmDataList().get(i)));
}
}
getFragmentManager().popBackStack(BCFragment.class.getName(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
/**
* 重置按钮
*
* @param view
*/
public void clickReset(View view) {
mBinding.chooseAllItems.setChecked(false);
for (int i = 0; i < mListAdapter.getCount(); i++) {
mListAdapter.getmDataList().get(i).setChecked(false);
mListAdapter.getmDataList().get(i).setVisible(true);
}
mListAdapter.notifyDataSetChanged();
}
}
adapter文件代码:
public class BCAdapter extends BaseAdapter {
private List<InfoItem> mDataList = new ArrayList<>();
private ItemInfoBinding itemBinding;
private LayoutInflater mInflater;
public BCAdapter(Context context, List<DetailInfo> dataList) {
mInflater = LayoutInflater.from(context);
for (int i = 0; i < dataList.size(); i++) {
mDataList.add(new InfoItem(dataList.get(i)));
}
}
@Override
public int getCount() {
return mDataList == null ? 0 : mDataList.size();
}
@Override
public InfoItem getItem(int position) {
return mDataList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (null == convertView) {
itemBinding = DataBindingUtil.inflate(mInflater, R.layout.item_info, parent, false);
convertView = itemBinding.getRoot();
convertView.setTag(itemBinding);
} else {
itemBinding = (ItemInfoBinding) convertView.getTag();
}
itemBinding.setAdapter(this);
itemBinding.setData(mDataList.get(position));
//判断是否选中
if (mDataList.get(position).isChecked()) {
itemBinding.itemCheckBox.setChecked(true);
} else {
itemBinding.itemCheckBox.setChecked(false);
}
//判断item是否显示**how to hide a listview item**
if (!mDataList.get(position).isVisible()) {
convertView.setLayoutParams(new AbsListView.LayoutParams(-1, 1));//-1代表LayoutParams.MATCH_PARENT
convertView.setVisibility(View.GONE);
} else {
convertView.setVisibility(View.VISIBLE);
convertView.setLayoutParams(new AbsListView.LayoutParams(-1, -2));//-2代表LayoutParams.WRAP_CONTENT
}
return convertView;
}
/**
* 点击某一个item
*/
public void checkItem(int position) {
if (mDataList.get(position).isChecked()) {
mDataList.get(position).setChecked(false);
} else {
mDataList.get(position).setChecked(true);
}
notifyDataSetChanged();
}
/**
* 全选
*/
public void checkAll() {
for (int i = 0; i < mDataList.size(); i++) {
if (mDataList.get(i).isVisible())
mDataList.get(i).setChecked(true);
}
notifyDataSetChanged();
}
/**
* 取消全选
*/
public void clearAll() {
for (int i = 0; i < mDataList.size(); i++) {
mDataList.get(i).setChecked(false);
}
notifyDataSetChanged();
}
/**
* 取消过滤,全部可见
*/
public void visibleAll() {
for (int i = 0; i < mDataList.size(); i++) {
mDataList.get(i).setVisible(true);
}
notifyDataSetChanged();
}
public List<InfoItem> getmDataList() {
return mDataList;
}
public void setmDataList(List<InfoItem> mDataList) {
this.mDataList = mDataList;
}
/**
* 统计选中item数量
*
* @return
*/
public int getCheckedItemNum() {
int num = 0;
for (InfoItem item : mDataList) {
if (item.isVisible() && item.isChecked())
num++;
}
return num;
}
/**
* 统计可见item数量
*
* @return
*/
public int getVisibleItemNum() {
int num = 0;
for (InfoItem item : mDataList) {
if (item.isVisible())
num++;
}
return num;
}
}
adapter中item_info.xml文件代码:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="adapter"
type="com.demo.BCAdapter" />
<variable
name="data"
type="com.demo.InfoItem" />
</data>
<RelativeLayout
android:id="@+id/goods_info_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal">
<CheckBox
android:id="@+id/item_check_box"
style="@style/custom_checkbox"
android:layout_width="40dp"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:checked="false"
android:clickable="false"
android:gravity="center" />
<LinearLayout
android:id="@+id/describe"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/item_check_box"
android:orientation="vertical">
<TextView
style="@style/text_important"
android:layout_width="0dp"
android:layout_weight="3.5"
android:text="66666/8888" />
<TextView
style="@style/text_important"
android:layout_width="0dp"
android:layout_weight="3.5"
android:text="66666/8888" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_below="@+id/describe"
android:background="@color/gray" />
</RelativeLayout>
</layout>
综上,DataBinding还是蛮方便的,可以省去之前各种findView的繁琐了。