Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当用户单击同一项目的按钮时,如何从recyclerview项目的EditText中获取文本?_Java_Android_Android Recyclerview_Onclicklistener - Fatal编程技术网

Java 当用户单击同一项目的按钮时,如何从recyclerview项目的EditText中获取文本?

Java 当用户单击同一项目的按钮时,如何从recyclerview项目的EditText中获取文本?,java,android,android-recyclerview,onclicklistener,Java,Android,Android Recyclerview,Onclicklistener,我正在设计一个RecyclerView列表。Recyclerview的每个项目都包含一个LinearLayout。此LinearLayout包含两个视图,第一个是EditText,第二个是Button。当用户点击按钮时,它触发onclick事件。从onClick listener,我需要获取EditText的内容。当用户点击另一个同级视图时,我找不到访问同级视图内容的方法 我的问题不是“如何将click listener设置为适配器内的按钮”。大多数人回答了如何将onClick listener

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

我的问题不是“如何将click listener设置为适配器内的按钮”。大多数人回答了如何将onClick listener设置为recyclerview项中的按钮。我的问题有点不同,当我在从button触发的onClick方法中时,我将如何访问button的兄弟edittext。每个项目都有一个edittext,因此当我单击按钮时,如何找到正确的edittext

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


如有任何帮助,我们将不胜感激。

您可以使用RecylcerView适配器的支架模式。然后可以在按钮上设置click listener并从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()
        }
    });
   }
}

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

abstract void onButtonClicked(String text);
步骤2:声明适配器摘要

步骤3:如果已实例化适配器,则重写活动中的方法(onButtonClicked(字符串文本);)

步骤4:在按钮的onClickListener内的适配器中调用函数:

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

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

您可以在“回收器”视图上设置的适配器中执行该操作

公共类MyViewHolder扩展了RecyclerView.ViewHolder{
公共图像视图mImageView;
公共MyViewHolder(查看项目视图){
超级(项目视图);
mImageView=itemView.findviewbyd(R.id.imageView);
}

}
首先,您需要两个引用:一个指向您的
编辑文本
,另一个指向您的
按钮
。您可以在您的
视窗夹中获取这些内容。接下来,您需要一个
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中,以确保单击按钮时实际调用了
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):


只需使用您的
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
中实现此功能(对于较新版本)。

在holder中使用如下自定义侦听器:

    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);
 }
  }

当人们不知道答案或不理解问题时,他们会把-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);
                                }
                           }
                      }`
`public void onClick(视图v){

for(int i=0;i请提供您尝试过的任何代码。我已在view.getParent()方法的帮助下解决了此问题。LinearLayout parent=(LinearLayout)v.getParent();EditText passwordView=null;for(int i=0;iI使用了holder并收到了onClick事件。但是,onClick只提供有关单击视图的信息。它没有提供访问其同级视图的方法。EditText是button的同级。它们是否在同一行中?如果button和edit text在同一行中。您可以使用此代码段。我尝试了此操作,但EditText不是v由于onclick是函数的回调类型,您的代码看起来正常。什么叫“edittext在onclick侦听器中无效”?如何在onClick方法中识别正确的EditText?它将只发送已单击按钮的视图详细信息!是的,它将发送。但是当您将onClick Listener放入ViewHolder中时,您已经获得了对正确EditText和按钮的引用(显然)因为您在ViewHolder类中。如果您将OnClickListener放在onBindViewHolder()中,那么该方法将向您传递一个ViewHolder实例(我想是吧?)或者数据集中的某个位置。通过此操作,您还可以获得对正确视图的引用。是否可以共享一些您认为有效的代码?我没有得到您的答案!!我现在添加了一些示例代码,包括在ViewHolder中实现OnClickListener和在onBindViewHolder()中添加OnClickListener谢谢。在onBindViewHolder内部实现onClick解决了这个问题。但是,我更愿意将我的所有单击侦听器放在一个位置。因此我选择在视图持有者内部添加单击侦听器。当我收到侦听器回调时,我选择了父对象,并通过父对象访问了第二个子对象。这样我就减少了混乱。你的答案是pe很好。再次感谢您的时间,先生。我如何才能将兄弟视图传递给onClick?您是
                    ` public void onClick(View v) {
                          for(int i = 0;i<parent.getChildCount();i++){
                               if(parent.getChildAt(i)instanceof EditText){
                                  passwordView = (EditText)parent.getChildAt(i);
                                }
                           }
                      }`