Android 读取recyclerview适配器活动中的数据

Android 读取recyclerview适配器活动中的数据,android,android-recyclerview,android-viewholder,Android,Android Recyclerview,Android Viewholder,我有一个带有卡片和微调器的recyclerview,微调器中选择的值需要发送到下一个活动以计算估计价格。我在活动中有一个按钮,它不属于recyclerview,它会将我带到下一个需要值的活动。因此,当我点击这个按钮时,我需要它来收集数据并将其发送到下一个活动,我如何才能做到这一点 我附上了一张照片。红色箭头(我在下一个活动中需要的数据),蓝色箭头(按下按钮将我带到下一个活动) 我用这个方法来读取值 findMerchantTextView.setOnClickListener(new View

我有一个带有卡片和微调器的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();
                }
            }
        });
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");
........
........
........


}
  • 假设您有一个类来定义数据
  • 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
    }
    
  • 为您的RecyclerView实现自定义适配器
  • 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
        }
    }
    
    公共类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。。。 //... //... //…您应该为每个微调器实现一个侦听器 } }
  • 在包含RecyclerView的活动或片段中,您应该实现接口并定义对象数组,并用数据填充适配器 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;
        }
        //...
        //...
      }
    }
    
    公共类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");
    ........
    ........
    ........
    
    
    }