我有一个带有卡片和微调框的recyclerview,需要将微调框内选择的值发送给下一个活动以计算估计价格。我在活动中有一个不是recyclerview的按钮,它将带我到需要这些值的下一个活动。因此,当我单击此按钮时,我需要它来收集数据并将其发送到下一个活动,我该如何实现。
我附上一张照片。红色箭头(我在下一个活动中需要的数据),蓝色箭头(按下按钮将我带到下一个活动)
我正在使用此方法读取值
findMerchantTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int i = 0; i < totalCards; i++) {
Spinner printColorSpinner = mRecyclerView.findViewHolderForLayoutPosition(i).itemView.findViewById(R.id.printColorSpinner);
Spinner printSidesSpinner = mRecyclerView.findViewHolderForAdapterPosition(i).itemView.findViewById(R.id.printSidesSpinner);
Spinner printSizeSpinner = mRecyclerView.findViewHolderForAdapterPosition(i).itemView.findViewById(R.id.paperSizeSpinner);
Spinner pagesSpinner = mRecyclerView.findViewHolderForAdapterPosition(i).itemView.findViewById(R.id.pagesSpinner);
Spinner orientationSpinner = mRecyclerView.findViewHolderForAdapterPosition(i).itemView.findViewById(R.id.orientationSpinner);
Spinner bindingTypeSpinner = mRecyclerView.findViewHolderForAdapterPosition(i).itemView.findViewById(R.id.bindingTypeSpinner);
MaterialTextView copiesTextView = mRecyclerView.findViewHolderForAdapterPosition(i).itemView.findViewById(R.id.copiesNumberText);
String color = printColorSpinner.getSelectedItem().toString().trim();
String sides = printSidesSpinner.getSelectedItem().toString().trim();
String size = printSizeSpinner.getSelectedItem().toString().trim();
String pages = pagesSpinner.getSelectedItem().toString().trim();
String orientation = orientationSpinner.getSelectedItem().toString().trim();
String bindingType = bindingTypeSpinner.getSelectedItem().toString().trim();
String totalCopies = copiesTextView.getText().toString().trim();
}
}
});
但是当i变为2时,findViewHolderForLayoutPosition返回NullPointerException。经过搜索,我知道这些视图已被回收,只有屏幕上显示的视图才可读。
获得这些值的替代方法是什么?谢谢!
RecyclerView重用视图以提高性能和内存消耗,并且您只能访问可见视图。一种实现目标的方法是使用一个接口来进行包含RecyclerView和Adapter的Activity之间的交互,并且它们会更新对象的主数组。
示例:
YourClass.java
public class YourClass extends Object implements Parcelable {
public String color = "";
public String sides = "";
public String size = "";
public String pages = "";
public String orientation = "";
public String bindingType = "";
public String totalCopies = "";
//... your methods and implementations
}
AdapterSpinnerListener.java
public interface AdapterSpinnerListener {
public void onSpinnerChanged(String spinnerType, String spinnerValue, int position);
//... other events
}
CustomAdapter.java
public class CustomAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private AdapterActionListener adapterActionListener; // Your constructor receive the Fragment of Activity which implements the AdapterSpinnerListener. // Also receive the array of objects to populate the RecyclerView public CustomAdapter(YourActivity activity, ArrayList<YourClass> customRows) { this.adapterActionListener = activity; } //... implements all the needed functions for the RecyclerView //getItemId //getItemCount //getItemViewType //onCreateViewHolder //In your onBindViewHolder, you should add a listener for each one of your spinners. //Also I'm supossing you have a CustomViewHolder to reference the Layout and Spinners. @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) { CustomViewHolder holder = (CustomViewHolder)viewHolder; holder.textViewSomething.setText(...); holder.printColorSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { if (adapterActionListener != null) { // You can retrieve the selected item using parent.getItemAtPosition(pos) adapterActionListener.onSpinnerChanged("color", selectedValue, position); } } @Override public void onNothingSelected(AdapterView<?> adapterView) { } }); //holder.printSidesSpinner.setOnItemSelectedListener... //... //... //... You should implement a listener for each spinner } }
- 在包含RecyclerView的Activity或Fragment中,您应该实现接口并定义对象数组,并使用数据填充适配器。
YourActivity.java
public class YourActivity extends AppCompatActivity implements AdapterSpinnerListener { private RecyclerView recyclerView; private CustomAdapter customAdapter; private ArrayList<YourClass> customRows; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); customAdapter = new CustomAdapter(this, customRows); recyclerView.setAdapter(customAdapter); recyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity())); } // Implements the method of the interface @Override public void onSpinnerChanged(String spinnerType, String spinnerValue, int position) { if (spinnerType.equals("color")) { customRows.get(position).color = spinnerValue; } else if (spinnerType.equals("sides")) { customRows.get(position).sides = spinnerValue; } //... //... } }
- 现在微调器的值在customRows数组内。您可以在点击事件中检索值
findMerchantTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int i = 0; i < customRows.size(); i++) {
String color = customRows.get(i).color;
String sides = customRows.get(i).sides;
//...
//...
//... all the values you want to get for the next activity
//...
}
}
});