Android 读取recyclerview适配器活动中的数据
我有一个带有卡片和微调器的recyclerview,微调器中选择的值需要发送到下一个活动以计算估计价格。我在活动中有一个按钮,它不属于recyclerview,它会将我带到下一个需要值的活动。因此,当我点击这个按钮时,我需要它来收集数据并将其发送到下一个活动,我如何才能做到这一点 我附上了一张照片。红色箭头(我在下一个活动中需要的数据),蓝色箭头(按下按钮将我带到下一个活动) 我用这个方法来读取值Android 读取recyclerview适配器活动中的数据,android,android-recyclerview,android-viewholder,Android,Android Recyclerview,Android Viewholder,我有一个带有卡片和微调器的recyclerview,微调器中选择的值需要发送到下一个活动以计算估计价格。我在活动中有一个按钮,它不属于recyclerview,它会将我带到下一个需要值的活动。因此,当我点击这个按钮时,我需要它来收集数据并将其发送到下一个活动,我如何才能做到这一点 我附上了一张照片。红色箭头(我在下一个活动中需要的数据),蓝色箭头(按下按钮将我带到下一个活动) 我用这个方法来读取值 findMerchantTextView.setOnClickListener(new View
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();
}
}
});
findMerchantTextView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
对于(int i=0;i
但当i变为2时,findViewHolderForLayoutPosition返回NullPointerException。我搜索并了解到视图是循环使用的,只有在屏幕上显示的视图才是可读的
获得这些值的替代方案是什么?谢谢 RecyclerView重用视图以提高性能和内存消耗,您只能访问可见视图。实现目标的一种方法是使用一个接口,用于包含RecyclerView和适配器的活动之间的交互,并更新对象的主数组 示例:
class MyAdapter extends ...........{
//have these as member fields
public String color = "default";
public String sides = "default";
public String size = "default";
public String pages = "default";
public String orientation = "default";
public String bindingType = "default";
public String totalCopies = "default";
.......
.......
//when you interact with the spinners in onBindViewHolder
@Override
public void onBindViewHolder(........){
//on selecting color spinner item
holder.colorSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
//set the color here
color =
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
}
});
//on selecting sides spinner item
holder.sidesSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
//set the sides here
sides =
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
}
});
// you get the idea, do the rest here..........
}
}
class YourActivity extends .........{
//lets say you initialized the adapter like this
MyAdapter adapter = new MyAdapter(.....);
//when you click the button:
findMerchantTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(YourActivity.this , TheOtherActivityName.class);
intent.putExtra("color" , adapter.color);
intent.putExtra("sides" , adapter.sides);
intent.putExtra("size" , adapter.size);
intent.putExtra("pages" , adapter.pages);
intent.putExtra("orientation" , adapter.orientation);
intent.putExtra("bindingType" , adapter.bindingType);
intent.putExtra("totalCopies" , adapter.totalCopies);
startActivity(intent);
}
});
}
class TheOtherActivityName extends .....{
//in onCreate()
String color = getIntent.getStringExtra("color");
String sides = getIntent.getStringExtra("sides");
String size = getIntent.getStringExtra("size");
........
........
........
}
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
}
public interface AdapterSpinnerListener {
public void onSpinnerChanged(String spinnerType, String spinnerValue, int position);
//... other events
}
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
}
}
公共类CustomAdapter扩展了RecyclerView.Adapter{
私有AdapterActionListener AdapterActionListener;
//构造函数接收实现AdapterPinnerListener的活动片段。
//还接收要填充RecyclerView的对象数组
公共CustomAdapter(YourActivity活动,ArrayList customRows)
{
this.adapterActionListener=活动;
}
//…实现RecyclerView所需的所有功能
//getItemId
//getItemCount
//getItemViewType
//onCreateViewHolder
//在onBindViewHolder中,应该为每个微调器添加一个侦听器。
//另外,我建议您使用CustomViewHolder来参考布局和微调器。
@凌驾
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder-ViewHolder,int-position){
CustomViewHolder=(CustomViewHolder)viewHolder;
holder.textViewSomething.setText(…);
holder.printColorSpinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共位置(AdapterView父项、视图、整数位置、长id){
if(adapterActionListener!=null){
//您可以使用parent.getItemAtPosition(pos)检索所选项目
adapterActionListener.onSpinnerChanged(“颜色”,selectedValue,position); } } @凌驾 未选择公共无效(AdapterView AdapterView){ } }); //holder.printSidesSpinner.setOnItemSelectedListener。。。 //... //... //…您应该为每个微调器实现一个侦听器 } }
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;
}
//...
//...
}
}
公共类YourActivity扩展AppCompative实现AdapterPinnerListener{
私人回收站;
专用自定义适配器;
私有ArrayList自定义行;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.your_活动);
recyclerView=(recyclerView)findViewById(R.id.recyclerView);
customAdapter=新的customAdapter(此为customRows);
recyclerView.setAdapter(customAdapter);
setLayoutManager(新的LinearLayoutManager(this.getActivity());
class TheOtherActivityName extends .....{
//in onCreate()
String color = getIntent.getStringExtra("color");
String sides = getIntent.getStringExtra("sides");
String size = getIntent.getStringExtra("size");
........
........
........
}