Android RecyclerView優雅的實現列表單選功能
阿新 • • 發佈:2019-01-01
1.前言
1.現在有一個簡單的需求,需要實現列表單選功能,如何實現尼?首先我大概說下我實現的思路,首先在Bean(實體類)裡面宣告一個boolean 值,根據這個boolean值去改變RadioButton的是否選中狀態,同時在Activity或者Fragment裡面 宣告一個變數id和當前下標去做對比。下面看下要實現的效果圖!
2.效果圖
3.程式碼實現步驟:
private CommonAdapter<SelectAddressModel.ReturnDataBean> mAdapter;
private List<SelectAddressModel.ReturnDataBean > mDataList = new ArrayList<>();
//private int posIndex;//記錄當前下標
private int mSelectedPos = -1;//實現單選 變數儲存當前選中的position
/*
* 獲取個人地址,這就是用Retrofit請求框架去獲取資料,用法就不多講了isState就是SelectAddressModel 實體類裡面宣告的一個boolean值
* */
public void getAddressData(String id) {
Api.getApi2().getLoadMemberAddressData (id)
.compose(callbackOnIOToMainThread())
.subscribe(new BaseNetSubscriber<SelectAddressModel>() {
@Override
public void onNext(SelectAddressModel baseBean) {
super.onNext(baseBean);
if (baseBean.getReturnData ().size() > 0) {
mDataList.addAll(baseBean.getReturnData());
mDataList.get(0).setState(true);
}
for (int i = 0; i < mDataList.size(); i++) {
if (mDataList.get(i).isState()) {
mSelectedPos = i;
}
}
mAdapter = new CommonAdapter<SelectAddressModel.ReturnDataBean>(aty, R.layout.layout_select_address, mDataList) {
@Override
protected void convert(ViewHolder holder, SelectAddressModel.ReturnDataBean item, int position) {
LinearLayout linAddress = holder.getView(R.id.linAddress);
RadioButton rad_balance = holder.getView(R.id.rad_balance);
RadioGroup radioGroup = holder.getView(R.id.rad_address);
rad_balance.setText(item.getS_weizhiFull());
if (!item.isState()) {
linAddress.setBackgroundColor(getResources().getColor(R.color.colorWhite));
rad_balance.setChecked(false);
} else {
linAddress.setBackgroundColor(getResources().getColor(R.color.address_bg));
rad_balance.setChecked(true);
}
rad_balance.setOnClickListener(v -> {
//實現單選方方法: 設定資料集時,找到預設選中的pos
if (mSelectedPos != position) {
//先取消上個item的勾選狀態
mDataList.get(mSelectedPos).setState(false);
linAddress.setBackgroundColor(getResources().getColor(R.color.colorWhite));
rad_balance.setChecked(false);
notifyItemChanged(mSelectedPos);
//設定新Item的勾選狀態
mSelectedPos = position;
mDataList.get(mSelectedPos).setState(true);
linAddress.setBackgroundColor(getResources().getColor(R.color.address_bg));
rad_balance.setChecked(true);
notifyItemChanged(mSelectedPos);
}
});
}
};
mBinding.recycviewAddress.setLayoutManager(new LinearLayoutManager(aty));
mBinding.recycviewAddress.setAdapter(mAdapter);
}
@Override
public void onError(Throwable e) {
super.onError(e);
}
});
}
4.注意要點:、
要實現單選功能以上程式碼就ok了,上面程式碼也有註釋,相信你們都能看懂!這裡要說一點 就是當你設定或者取消Item的勾選狀態時候,一定要記得notifyItemChanged去更新當前的下標,其實實現列表單選有很多方法,不止這一種,要是寫的不好的地方勿噴!謝謝,好啦 程式碼就分析到這裡,有啥問題 歡迎留言。