代码之家  ›  专栏  ›  技术社区  ›  Shibin Francis

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

  •  -1
  • Shibin Francis  · 技术社区  · 7 年前

    我正在设计一个回收服务清单。Recyclerview的每个项都包含一个LinearLayout。此线性布局包含两个视图,第一个视图是EditText,第二个视图是Button。当用户点击按钮时,会触发onclick事件。从onClick listener,我需要获取EditText的内容。当用户点击另一个同级视图时,我找不到访问同级视图内容的方法。

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

    例如,我有一个10号的recylerview。recyclerview的每个项目都包含一个LinearLayout和一个inside LinearLayout两个项目,一个是Edittext,另一个是按钮。当我点击7th item s按钮时,如何获取7th item的Edittext文本?我希望我已经解释清楚了

    任何帮助都将不胜感激。

    7 回复  |  直到 7 年前
        1
  •  0
  •   privoid    7 年前

    首先,你需要两个推荐人:一个是你的 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,则可以执行以下操作 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();
            }
        });
    }
    
        2
  •  0
  •   Jaswant Singh    7 年前

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

    abstract void onButtonClicked(String text);
    

    步骤2:声明适配器抽象。

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

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

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

    您将在活动中获取重写该方法的字符串。

        3
  •  0
  •   Ehsan Mashhadi    7 年前

    您可以为RecylcerView适配器使用holder模式。然后您可以在按钮上设置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()
            }
        });
       }
    }
    
        4
  •  0
  •   Unrealshadow    7 年前

    您可以在适配器中执行此操作,该适配器正在“回收器”视图中设置。

     public class MyViewHolder extends RecyclerView.ViewHolder {
    
            public ImageView mImageView;
    
            public MyViewHolder(View itemView) {
                super(itemView);
    
                mImageView = itemView.findViewById(R.id.imageView);
    
            }
        }

    在bindview持有者中,您可以访问视图

    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
                }
            });
        }
        5
  •  0
  •   Francis Nduba Numbi    7 年前

    在保持架中使用这样的自定义侦听器:

        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
  •  0
  •   Lucem    7 年前

    只需使用 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
  •  0
  •   Shibin Francis    7 年前

    当人们不知道答案或者不理解问题的时候,他们会放-1。真有趣!!在onclick中,我从视图中获取父对象(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);
                                    }
                               }
                          }`