如何从RecyclerView项中获取Value
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从RecyclerView项中获取Value相关的知识,希望对你有一定的参考价值。
我有一个Fragment,它带有一个Button和一个RecyclerView,由RecyclerView Adapter设置。在RecyclerView中有几个Items,其中一个是EditText。现在我希望在单击Button时(不在RecyclerView对象中),我得到EditTexts的值。
我已经尝试获取了recyclerView.getItemAtPosition()但是没有这样的函数,也尝试了相同的适配器。所以我需要像ArrayList s.add(recyclerView.getItemAtPosition(position).getEditText()。getText()。toString());
这是我的适配器:
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();
}
}
这是我的片段:
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;
我没有任何想法继续下去所以我将非常感谢你的帮助。如果我对问题的描述有任何不确定性,请不要犹豫。
问候亚历山大
使用RecyclerView
,您必须了解您的EditText
s将被回收。例如,如果您有200个项目的列表,并且它一次显示2个项目,那么您将只有2个EditText
。他们将重用较高的EditText
作为较低的元素。
例如,这是一个包含EditText
的列表,一次只显示2个,当用户滚动时,它将回收并重用它们。
- EditText A.
- 编辑文字B.
- EditText A(回收)
- EditText B(回收)
- ....
这意味着您不能稍后遍历所有元素并获取值,因为它们不存储它们的值。
所以,你想要做的是,当用户修改EditText
时,你想立即存储该值。你可以通过添加TextWatcher
到你的EditText
来做到这一点。
注意 - 我确实假设你将权重存储为字符串值,所以我只是从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;
}
我认为你应该在Adapter类中使用ArrayList来保存你的项目(或者只是EditText组件的字符串)。在为editext设置文本后,在onBindViewHolder()中将Array添加到ArrayList。然后创建一个函数,它将从您的ArrayList获取项目,如:
public String getItem(int position){
arrayList.get(position);
}
并从Fragment中的onClick()函数调用它。
我认为您可以创建静态按钮,然后您可以访问适配器中的该按钮,然后在按钮的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方法中。
以上是关于如何从RecyclerView项中获取Value的主要内容,如果未能解决你的问题,请参考以下文章
从 bool 为 true 的重复项中获取一个,如果没有则为后备