注意: 本篇中的代碼爲實際工程代碼,作爲個人的代碼筆記並非純粹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的繁瑣了。