【问题标题】:How to get the Value out of an RecyclerView item如何从 RecyclerView 项目中获取价值
【发布时间】:2018-12-28 18:43:55
【问题描述】:

我有一个带有 Button 和 RecyclerView 的 Fragment,由 RecyclerView 适配器设置。在 RecyclerView 中有几个 Item,其中一个是 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;

我没有任何想法可以继续,因此非常感谢您的帮助。如果我对问题的描述有任何不确定性,请随时询问。

问候亚历山大

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    使用RecyclerView,您必须了解您的EditTexts 将被回收。例如,如果您有一个包含 200 个项目的列表,并且一次显示 2 个项目,那么您将永远只有 2 个EditText。他们将为较低的元素重用较高的EditText

    例如,这是一个包含EditText 的列表,一次只显示 2 个,并且随着用户滚动,它会回收和重复使用它们。

    1. EditText A
    2. 编辑文本 B
    3. EditText A(回收)
    4. EditText B(回收)
    5. ....

    这意味着您不能稍后遍历所有元素并获取值,因为它们不存储它们的值。

    因此,您想要做的是,当用户修改 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;
    }
    

    【讨论】:

    • 感谢您的回答,尤其是您的解释。我不知道,谢谢:)
    【解决方案2】:

    我认为您应该在 Adapter 类中使用 ArrayList 来保留您的项目(或只是 EditText 组件的字符串)。为 editext 设置文本后,将字符串添加到 onBindViewHolder() 中的 ArrayList。然后创建一个函数,该函数将从您的 ArrayList 中获取项目,例如:

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

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

    【讨论】:

      【解决方案3】:

      我认为您可以创建静态按钮,然后您可以在适配器中访问该按钮,然后在按钮的 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();
               }
      
              }
      });
      

      并将这个 onclick 放在你的 onbindviewholder 方法中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-17
        相关资源
        最近更新 更多