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

问题描述 投票:-1回答:2

我有一个带有卡片和微调框的recyclerview,需要将微调框内选择的值发送给下一个活动以计算估计价格。我在活动中有一个不是recyclerview的按钮,它将带我到需要这些值的下一个活动。因此,当我单击此按钮时,我需要它来收集数据并将其发送到下一个活动,我该如何实现。

我附上一张照片。红色箭头(我在下一个活动中需要的数据),蓝色箭头(按下按钮将我带到下一个活动)

Screenshot of screen

我正在使用此方法读取值

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。经过搜索,我知道这些视图已被回收,只有屏幕上显示的视图才可读。

获得这些值的替代方法是什么?谢谢!

android android-recyclerview recycler-adapter android-viewholder
2个回答
0
投票

RecyclerView重用视图以提高性能和内存消耗,并且您只能访问可见视图。一种实现目标的方法是使用一个接口来进行包含RecyclerView和Adapter的Activity之间的交互,并且它们会更新对象的主数组。

示例:

  1. 想象您有一个用于定义数据的类。

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
}
  1. 让我们定义一个接口来处理微调框的事件

AdapterSpinnerListener.java

public interface AdapterSpinnerListener {
    public void onSpinnerChanged(String spinnerType, String spinnerValue,  int position);

    //... other events
}
  1. 为您的RecyclerView实现自定义适配器到>
  2. 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
    }
}
  1. 在包含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;
    }
    //...
    //...
  }
}
  1. 现在微调器的值在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
                //... 
            }
        }
    });
    

0
投票

假设每个微调框选择一个项目:

© www.soinside.com 2019 - 2024. All rights reserved.