DataBinding實現ListView

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章