【问题标题】:How can I get the text from EditText of a recyclerview item when user clicks on a button of the same item?当用户单击同一项目的按钮时,如何从 recyclerview 项目的 EditText 获取文本?
【发布时间】:2018-08-05 18:29:14
【问题描述】:

我正在设计一个 RecyclerView 列表。 Recyclerview 的每一项都包含一个 LinearLayout。此 LinearLayout 包含两个视图,第一个是 EditText,第二个是 Button。当用户点击按钮时,它会触发一个 onclick 事件。从 onClick 侦听器中,我需要获取 EditText 的内容。当用户点击另一个同级视图时,我找不到访问同级视图内容的方法。

我的问题不是“如何将点击侦听器设置为适配器内的按钮”。大多数人回答了如何将 onClick 侦听器设置为 recyclerview 项目内的按钮。我的问题有点不同,当我在从按钮触发的 onClick 方法中时,我将如何访问作为按钮兄弟的 edittext。每个项目都有一个编辑文本,所以当我点击一个按钮时,我将如何找到正确的编辑文本?

例如,我有一个大小为 10 的 recyclerview。recyclerview 的每个项目都包含一个 LinearLayout 和内部 linearlayout 两个项目,一个是 Edittext,另一个是一个 Button。当我点击第 7 个项目按钮时,我将如何获取第 7 个项目的 Edittext 的文本?我希望我已经解释清楚了

任何帮助将不胜感激。

【问题讨论】:

  • 请提供您尝试过的任何代码。
  • 我已经在 view.getParent() 方法的帮助下解决了这个问题。线性布局父 = (LinearLayout)v.getParent(); EditText 密码视图 = null; for(int i = 0;i

标签: java android android-recyclerview onclicklistener


【解决方案1】:

首先,您需要两个引用:一个指向您的EditText,一个指向您的Button。您可以在ViewHolder 中获取这些信息。接下来,您需要一个OnClickListener。 ViewHolder 也可以方便地实现一个,但您也可以使用onBindViewHolder()

在 OnClickListener 中,您可以根据需要使用 switch 语句过滤掉您的 id,然后像这样获取 EditText 的内容:

switch(viewId) {
    case R.id.buttonId:
        String text = editText.getText().toString();
        // do something with that text
        return true;
}

如果您在 ViewHolder 中实现了 OnClickListener,您可以在 ViewHolder 中执行 button.setOnClickListener(this); 以确保在您单击按钮时实际调用 onClick()

编辑: 这是一些适用于您的案例的示例代码。如上所述,我在这里实现 View.OnClickListener。

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    EditText editText;
    Button button;

    public ViewHolder(View itemView) {
        super(itemView);

        editText = itemView.findViewById(R.id.editText);
        button = itemView.findViewById(R.id.button);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch(view.getId()) {
            case R.id.button:
                String text = editText.getText().toString();
                break;
        }
    }
}

如果您要在 onBindViewHolder() 中执行此操作,这就是它的样子(在这种情况下,您显然会在 ViewHolder 中实现 OnClickListener):

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String text = holder.editText.getText().toString();
        }
    });
}

【讨论】:

  • 如何在 onClick 方法中识别正确的 EditText?它只会发送点击按钮的查看详情!
  • 是的,它会的。但是,当您将 OnClickListener 放在 ViewHolder 中时,您已经获得了对正确 EditText 和 Button 的引用(显然),因为您在 ViewHolder 类中。如果你把 OnClickListener 放在 onBindViewHolder();该方法向您传递 ViewHolder 的实例(我认为?)或数据集中的位置。有了这个,您还可以获得对正确视图的引用。
  • 可以分享一些您认为可行的代码吗?我没有得到你的答案!
  • 我现在添加了一些示例代码,包括在 ViewHolder 中实现 OnClickListener 以及在 onBindViewHolder() 中添加 OnClickListener
  • 谢谢。在 onBindViewHolder 中实现 onClick 解决了这个问题。但是,我宁愿将所有点击监听器都放在一个地方。所以我选择在我的视图持有者内部添加点击监听器。当我收到侦听器回调时,我接受了父母并通过父母访问了第二个孩子。这样我就减少了混乱。你的答案很完美。再次感谢您的宝贵时间先生。
【解决方案2】:

第 1 步:在适配器中创建一个抽象函数。

abstract void onButtonClicked(String text);

第 2 步:声明您的适配器摘要。

第 3 步:在您实例化适配器的情况下,覆盖 Activity 中的方法 (onButtonClicked(String text);)。

第 4 步:在你的适配器里面的 onClickListener 中为你的按钮调用函数:

onButtonClicked(editText.getText().toString());

您将在您的活动中获得覆盖该方法的字符串。

【讨论】:

  • 您必须在 ViewHolder 类中的适配器中初始化您的编辑文本,就像您对按钮所做的那样。请分享代码,以便我们更准确地理解它
  • 但是,仍然无法在 onClick 中访问正确的 edittext 实例。这是一个回调类型的函数,edittext的实例在外面是可用的。
【解决方案3】:

您可以为 RecyclerView 适配器使用支架模式。然后你可以在你的按钮上设置点击监听器并从 EditText 获取文本。

public class SimpleViewHolder extends RecyclerView.ViewHolder {

private EditText simpleEditText;
private Button simpleButton;

public SimpleViewHolder(final View itemView) {

    super(itemView);
    simpleEditText = (EditText) itemView.findViewById(R.id.simple_edit_text);
    simpleButton = (Button) itemView.findViewById(R.id.simple_button);

    simpleButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String text = simpleEditText.getText().toString()
        }
    });
   }
}

【讨论】:

  • 我已经使用了持有人并收到了onClick事件。但是,onClick 仅提供有关单击视图的信息。它没有提供访问其兄弟视图的方法。 EditText 是 Button 的兄弟
  • 他们在同一行吗?如果按钮和编辑文本在同一行。你可以使用这个代码sn-p。
  • 我试过了,但由于 onclick 是回调类型的函数,所以 edittext 在 onclick 侦听器中无效
  • 您的代码看起来不错。 “edittext 在 onclick 侦听器中无效”是什么意思?
【解决方案4】:

您可以在回收站视图中设置的适配器内执行此操作。

 public class MyViewHolder extends RecyclerView.ViewHolder {

        public ImageView mImageView;

        public MyViewHolder(View itemView) {
            super(itemView);

            mImageView = itemView.findViewById(R.id.imageView);

        }
    }

在 bindview holder 中,您可以访问视图

public void onBindViewHolder(@NonNull final ImageAdapter.MyViewHolder holder, int position) {
      holder.mImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
             //Your Code to access the edit text content
            }
        });
    }

【讨论】:

  • 如何将兄弟视图传递给 onClick?
  • 当视图绑定在 OnBindViewHolder 中时,您正试图访问错误位置的数据
  • 添加的代码是由同一页面的某人建议的,添加的只是为了参考以了解我需要做什么。即使从支架部分使用它也会面临同样的问题。我修改了我的问题以使问题更清楚。谢谢
【解决方案5】:

在持有人中使用这样的自定义侦听器:

    public class SimpleViewHolder extends RecyclerView.ViewHolder {
 private EditText simpleEditText;  
private Button simpleButton;  
public SimpleViewHolder(final View itemView, final OnItemSelectedListener listener) {  
super(itemView);  
simpleEditText = (EditText) itemView.findViewById(R.id.simple_edit_text);  
simpleButton = (Button) itemView.findViewById(R.id.simple_button); 
 simpleButton.setOnClickListener(new View.OnClickListener() {  
@Override public void onClick(View v) {  
String text = simpleEditText.getText().toString();
 if(listener != null) listener.onItemSelected(text);
  }
  });
  }

    public interface OnItemSelectedListener{ 
void onItemSelected(String value);
 }
  }

【讨论】:

    【解决方案6】:

    只需使用您的ViewHolder。它包含您想要的所有孩子。在适配器中实现代码,其中每个项目都被膨胀。这是一个例子。

    //inside the onBindViewHolder
    viewHolder.button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String text = viewHolder.editText.getText().toString();
                        Log.d("output", text);
                    }
                });
    

    如果您使用的是FirebaseUI,请在旧版本的populateViewHolder 和更高版本的onBindViewHolder 中执行此操作。

    【讨论】:

      【解决方案7】:

      当人们不知道答案或不理解问题时,他们会输入 -1。好笑!!在 onclick 中,我从视图中获取了 parent(getParent()) 并访问了父级的第二个子级。这样我就可以访问兄弟姐妹的内容了。

                          ` public void onClick(View v) {
                                for(int i = 0;i<parent.getChildCount();i++){
                                     if(parent.getChildAt(i)instanceof EditText){
                                        passwordView = (EditText)parent.getChildAt(i);
                                      }
                                 }
                            }`
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-23
        • 1970-01-01
        • 2020-07-17
        • 2018-09-01
        • 1970-01-01
        相关资源
        最近更新 更多