android - 具有多个微调器问题的 Recyclerview 问题
问题描述
我的回收站视图中有 2 个微调器。现在我的第二个微调器值取决于第一个微调器选定的项目。
我能够在微调器 1 中绑定数据,但是当我尝试基于微调器 1 的 setOnItemSelectedListener 绑定微调器 2 数据时,它只会绑定屏幕上的可见项目。
我想绑定微调器 2 数据,即使它在屏幕上不可见。我有以下适配器代码:
public class CustomerAdapter extends RecyclerView.Adapter<CustomerAdapter.CardViewHolder> {
private ArrayList<MainDetails> mMainDetails;
private Context mContext;
public CustomerAdapter(Context mcontext, ArrayList<MainDetails> mainDetails) {
mContext = mcontext;
mMainDetails = mainDetails;
}
private Context getContext() {
return mContext;
}
@Override
public CardViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
Context context = viewGroup.getContext();
View itemView = LayoutInflater.from(context).inflate(R.layout.row_bind_data, viewGroup, false);
return new CardViewHolder(itemView);
}
@Override
public void onBindViewHolder(final CardViewHolder cardViewHolder, int position) {
final MainDetails testMainDetails = mMainDetails.get(position);
ArrayAdapter<Products> spinnerUserAdapter = new ArrayAdapter<Products>(getContext(), R.layout.dropdown_item, testMainDetails.getUsers());
spinnerUserAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
cardViewHolder.spinner1.setAdapter(spinnerUserAdapter);
cardViewHolder.spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
try {
Products pp = (Products) parent.getSelectedItem();
ArrayAdapter<Orders> spinnerPPAdapter = new ArrayAdapter<Orders>(getContext(), R.layout.pc_estimator_dropdown_item, pp.getOrders());
spinnerPPAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
cardViewHolder.spinner2.setAdapter(spinnerPPAdapter);
} catch (Exception e) {
Log.e("error", e.toString());
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
cardViewHolder.spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
//other operation
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
@Override
public int getItemCount() {
return mMainDetails.size();
}
public static class CardViewHolder extends RecyclerView.ViewHolder {
public Spinner spinner1;
public Spinner spinner2;
public CardViewHolder(View v) {
super(v);
spinner1 = (Spinner) v.findViewById(R.id.spinner1);
spinner2 = (Spinner) v.findViewById(R.id.spinner2);
}
}
}
我的微调器cardViewHolder.spinner1.setOnItemSelectedListener
方法只要求屏幕上的可见项目,但我想绑定所有数据,即使它不可见。
解决方案
直接在里面onBindViewHolder
你只设置一个适配器,spinner1
而没有任何东西spinner2
- 它只有在onItemSelected
调用之后才得到它的适配器spinner1
如果你想为你设置一些初始值,spinner2
你必须在里面启动它的适配器onBindViewHolder
,而不仅仅是在onItemSelected
将您的适配器启动代码移动到单独的方法
public void setUpSpinner2(Spinner spinner, Products pp) {
try {
ArrayAdapter<Orders> spinnerPPAdapter = new ArrayAdapter<Orders>(getContext(), R.layout.pc_estimator_dropdown_item, pp.getOrders());
spinnerPPAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(spinnerPPAdapter);
} catch (Exception e) {
Log.e("error", e.toString());
}
}
然后在里面onItemSelected
调用它
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Products pp = (Products) parent.getSelectedItem();
setUpSpinner2(cardViewHolder.spinner2, pp);
}
并且还通过检查setUpSpinner2
直接在内部调用(是否在开始时选择了项目)onBindViewHolder
null
if (spinnerUserAdapter.getSelectedItem() != null) {
Products pp = (Products) spinnerUserAdapter.getSelectedItem();
setUpSpinner2(cardViewHolder.spinner2, pp);
}
顺便提一句。我看到您没有spinner1
在任何地方存储选定的值,因此回收后两个微调器将再次为空。所以在onItemSelected
获取所选项目的位置(有方法getSelectedItemPosition
)并将其存储在某个数组中
//top of adapters code
private ArrayList<MainDetails> mMainDetails;
private Context mContext;
private SparseArray<Integer> selectedItemsForPositions = new SparseArray<>();
在此行onItemSelected
中onNothingSelected
放置/清除所选值(不要混合 and 的位置onBindViewHolder
,onItemSelected
以不同的方式命名它们)
selectedItemsForPositions.put(onBindViewHolderPosition, parent.getSelectedItemPosition());
// or put null if nothing selected
当你有这个保持选定位置的阵列时,然后在spinner1
适配器设置后恢复这个位置
cardViewHolder.spinner1.setAdapter(spinnerUserAdapter);
Integer selectedPosition = selectedItemsForPositions.get(onBindViewHolderPosition);
if(selectedPosition != null) spinnerUserAdapter.setSelection(selectedPosition);
推荐阅读
- angular - 角度 5 中的拦截器
- r - 在具有 beta 分布的 glmmTMB 中考虑跨组的异方差
- css - 反应scss媒体查询不翻译最大宽度
- fullcalendar - Fullcalendar 活动内容置顶
- enums - 向 Kotlin 中的现有枚举添加属性
- c# - 为什么我会收到此异常 System.ArgumentOutOfRangeException?我错过了什么?
- c++ - 访问同级类实例的成员
- windows - php环境变量在windows server 2012上不起作用
- python - python解析xml以获取大于给定值的字符串
- reactjs - React Native 根据 API 请求自动打开应用程序屏幕,就像 whatsapp / Viber 接听电话一样