DataBinding implements ListView

Note: The code in this article is the actual engineering code. As a personal code note, it is not a pure demo. Readers can refer to the general idea.

Very simple, the traditional ListView + Adapter method is still used, but the items in the Adapter are implemented using DataBinding.

Fragment requirements are as follows:


And the items in the list can be dynamically hidden/displayed according to requirements.

Fragment file code:


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 file code:

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;
    }
}

The item_info.xml file code in the adapter:

<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>

In summary, DataBinding is quite convenient, and can save the tediousness of various findViews before.

Guess you like

Origin blog.csdn.net/lrxb_123/article/details/53068329