Android开发:如何让RecyclerViewAdapter监听Spinner内置CheckBox选中状态
实现方案
你可以通过自定义回调接口的方式,将CheckBox的选中事件逐层传递到RecyclerViewAdapter中,修改步骤如下:
1. 新增状态变更回调接口
先定义专门用于通知选中状态变更的接口,放在你的Interface目录下:
namespace AndroidRegFirstApp.Interface { public interface IOnAdditionCheckChangedListener { // 参数可根据你的业务需求自由调整 void OnAdditionCheckChanged(ProductAddition changedItem, int spinnerItemPosition, bool isChecked); } }
2. 修改自定义OnCheckedListener
给原有监听类新增回调参数,状态变更时同时触发回调:
namespace AndroidRegFirstApp.Interface { public class OnCheckedListener : Java.Lang.Object, CompoundButton.IOnCheckedChangeListener { private List<ProductAddition> additions; private IOnAdditionCheckChangedListener mCallback; // 构造方法新增回调入参 public OnCheckedListener(List<ProductAddition> list, IOnAdditionCheckChangedListener callback) { this.additions = list; this.mCallback = callback; } public void OnCheckedChanged(CompoundButton buttonView, bool isChecked) { int position = (int)buttonView.Tag; this.additions[position].Product_Addition_Selected = isChecked; // 触发上层回调 mCallback?.OnAdditionCheckChanged(additions[position], position, isChecked); } } }
3. 修改AdditionSpinnerAdapter
新增回调成员,构造方法接收回调后传递给OnCheckedListener:
namespace AndroidRegFirstApp.Adapter { public class AdditionSpinnerAdapter : ArrayAdapter<ProductAddition> { private Context mContext; private List<ProductAddition> additions; // 新增回调成员 private Interface.IOnAdditionCheckChangedListener mCheckCallback; // 构造方法新增回调入参 public AdditionSpinnerAdapter(Context context, int resource, List<ProductAddition> objects, Interface.IOnAdditionCheckChangedListener callback) :base (context, resource, objects) { this.mContext = context; this.additions = objects; this.mCheckCallback = callback; } public override View GetDropDownView(int position, View convertView, ViewGroup parent) { return this.GetCustomView(position, convertView, parent); } public override View GetView(int position, View convertView, ViewGroup parent) { return this.GetCustomView(position, convertView, parent); } public View GetCustomView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.From(mContext); convertView = inflater.Inflate(Resource.Layout.additionSpinnerItem, null); TextView AdditionText = convertView.FindViewById<TextView>(Resource.Id.additionText); CheckBox AdditionSelected = convertView.FindViewById<CheckBox>(Resource.Id.additionSelected); AdditionText.Text = additions[position].Product_Addition_Name; AdditionSelected.Checked = additions[position].Product_Addition_Selected; AdditionSelected.Tag = position; if (position == 0) { AdditionSelected.Visibility = ViewStates.Gone; } // 给监听传入回调 AdditionSelected.SetOnCheckedChangeListener(new Interface.OnCheckedListener(additions, mCheckCallback)); return convertView; } } }
4. 改造RecyclerViewAdapter接入回调
让你的RecyclerViewAdapter实现刚才定义的回调接口,初始化Spinner时传入自身即可:
// 让RecyclerViewAdapter实现回调接口 public class YourRecyclerViewAdapter : RecyclerView.Adapter, Interface.IOnAdditionCheckChangedListener { // 你原有RecyclerViewAdapter的其他逻辑保持不变... // 实现回调方法,写你需要执行的业务逻辑 public void OnAdditionCheckChanged(ProductAddition changedItem, int spinnerItemPosition, bool isChecked) { // 此处写你的业务代码:比如更新当前RecyclerViewItem状态、刷新列表、数据持久化等 } // 修改原有Spinner初始化逻辑,多传入this作为回调 private void InitSpinner(ViewHolder vh, CategoryProductAddition categoryProductAddition) { AdditionSpinnerAdapter adapter = new AdditionSpinnerAdapter(context, 0, categoryProductAddition.Product_Additions, this); vh.AdditionSpinner.Adapter = adapter; } }
内容的提问来源于stack exchange,提问作者reven102
相关产品推荐
相关产品推荐

