如何从RecyclerView项中获取值

3
我有一个Fragment,里面有一个按钮和一个RecyclerView,由RecyclerView Adapter设置。RecyclerView中有多个项,其中一个是EditText。现在我想要的是,当点击按钮时(该按钮不在RecyclerView对象中),我可以获取EditText的值。
我已经尝试过获取recyclerView.getItemAtPosition(),但没有这样的函数,也尝试了同样的适配器。所以我需要像这样的东西: ArrayList s.add(recyclerView.getItemAtPosition(position).getEditText().getText().toString());
以下是我的Adapter:
public class RVSetAdapter extends RecyclerView.Adapter<RVSetAdapter.ViewHolder> {

private Exercise exercise;

public static class ViewHolder extends RecyclerView.ViewHolder {

    public EditText et_weight;
    public TextView tv_sets,tv_indication;

    public ViewHolder(@NonNull final View itemView) {

        super(itemView);
        tv_sets = itemView.findViewById(R.id.tv_sets);
        tv_indication = itemView.findViewById(R.id.tv_indication);
        et_weight = itemView.findViewById(R.id.et_weight);
    }

}

public RVSetAdapter(Exercise exercise) {
    this.exercise = exercise;
}

@NonNull
@Override
public RVSetAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.rv_set,viewGroup,false);
    RVSetAdapter.ViewHolder vh_set = new RVSetAdapter.ViewHolder(view);

    return vh_set;
}

@Override
public void onBindViewHolder(@NonNull final RVSetAdapter.ViewHolder viewHolder,final int i) {
    if(exercise.getKind() == 80) {
        viewHolder.tv_sets.setText("");
        viewHolder.tv_indication.setText("sec.");
    }else if(exercise.getKind() == 90) {
        viewHolder.tv_sets.setText("");
        viewHolder.tv_indication.setText("min.");
    }else {
        viewHolder.tv_sets.setText(Integer.toString(i + 1) + ".");
    }
    viewHolder.et_weight.setText(Integer.toString(exercise.getWeights().get(i)));
}

@Override
public int getItemCount() {
    return exercise.getWeights().size();
}

这是我的碎片:

<Fragment>

final View view = layoutInflater.inflate(R.layout.fragment_exercise, container,false);

    ImageView iv_exercise = view.findViewById(R.id.iv_exercise);
    ImageView iv_musclekind = view.findViewById(R.id.iv_musclekind);
    ImageView iv_save = view.findViewById(R.id.iv_save);
    TextView tv_exercisename = view.findViewById(R.id.tv_exercisename);
    TextView tv_exercisedescription = view.findViewById(R.id.tv_exercisedescription);

    iv_exercise.setImageResource(exercises.get(position).getImage());
    iv_musclekind.setImageResource(exercises.get(position).getMusclekindImage());
    tv_exercisename.setText(exercises.get(position).getName());
    tv_exercisedescription.setText(exercises.get(position).getDescription());

    iv_save.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //here I want to get the Values of the EditTexts and put them into an Array
        }
    });

    recyclerView = view.findViewById(R.id.rv_sets);
    recyclerView.setHasFixedSize(true); //maybe change this
    layoutManager = new LinearLayoutManager(view.getContext());
    adapter = new RVSetAdapter(exercises.get(position));
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setAdapter(adapter);

    container.addView(view);

    return view;

我目前没有任何想法,希望你能提供帮助。如果我的问题描述有任何不确定之处,请不要犹豫,随时问我。

问候,Alexander

3个回答

8
使用 RecyclerView 时,需要了解您的 EditText 将被回收。例如,如果您有一个包含 200 个项目的列表,每次显示两个项目,那么您只会有 2 个 EditText。它们将重用更高的 EditText 来为下面的元素提供服务。
例如,这是一个包含 EditText 的列表,每次只显示两个,随着用户的滚动,它将进行回收和重用。
  1. EditText A
  2. Edittext B
  3. EditText A (已回收)
  4. EditText B (已回收)
  5. ....
这意味着您不能仅简单地循环遍历所有元素并获取值,因为它们不会存储其值。
所以,当用户修改 EditText 时,您需要立即存储该值。您可以通过向 EditText 添加 TextWatcher 来实现此目的。
请注意 - 我假设您将您的权重存储为 String 值,因此我只是从 EditText 中取出该值并将其存储到您的 Exercise 对象中。您可能需要在此之前进行转换。
public class RVSetAdapter extends RecyclerView.Adapter<RVSetAdapter.ViewHolder> {

    private Exercise exercise;

    // ...

    @Override
    public void onBindViewHolder(@NonNull final RVSetAdapter.ViewHolder viewHolder,final int i) {
        // ...

        viewHolder.et_weight.setText(Integer.toString(exercise.getWeights().get(i)));
        viewHolder.et_weight..addTextChangedListener(new TextWatcher() {

            public void afterTextChanged(Editable s) {
                // This will be the text from the EditText
                String text = s.toString();

                // Store the value back into your exercise Object.
                exercise.getWeights().get(i).setWeight(text);
            }

            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            public void onTextChanged(CharSequence s, int start, int before, int count) {}
        });
    }

    // ...

    // Add a method for easy access to your weights.
    public ArrayList<String> getWeights() {
        return exercise.getWeights();
    }
}

现在,在您的Fragment中,您可以轻松地从RVSetAdapter中获取值。

public View onCreateView() {
    final View view = layoutInflater.inflate(R.layout.fragment_exercise, container,false);

    // ... 

    iv_save.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Use the method we added to your adapter to return the weights.
            ArrayList<String> weights = adapter.getWeights();
        }
    });

    // ...

    return view;
}

1
感谢你的回答,尤其是解释得这么清楚。我之前不知道,谢谢 :) - Pumpanickel

0

我认为您应该在适配器类中使用ArrayList来保存项目(或仅EditText组件的字符串)。在设置edittext文本后,在onBindViewHolder()中将String添加到ArrayList中。然后编写一个函数,该函数将从ArrayList中获取项目,如下所示:

public String getItem(int position){
    arrayList.get(position);
}

并且从您的Fragment中的onClick()函数中调用它。


0

我认为你可以创建静态按钮,然后在适配器中访问该按钮,然后在按钮的onclick上实现功能。

static Button btn;

然后在您的适配器中实现如下...

btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
         for(int i=0;i<arraylist.size();i++)
         {
              arr[i]= holder.edit_Text.getText().toString();
         }

        }
});

并将此放入您的onbindviewholder方法中的onclick中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接