我正在设计一个RecyclerView列表。 Recyclerview的每个项目都包含一个LinearLayout。这个LinearLayout包含两个视图,第一个是EditText,第二个是Button。当用户点击按钮时,它会触发一个onclick事件。从onClick侦听器,我需要获取EditText的内容。当用户点击另一个同级视图时,我找不到访问同级视图内容的方法。
我的问题不是“如何在单击侦听器上设置适配器内的按钮”。大多数人回答了如何将onClick侦听器设置为recyclerview项内的按钮。我的问题有点不同,当我在从按钮触发的onClick方法中时,如何访问按钮同级的edittext。每个项目都有一个edittext,所以当我单击一个按钮时,如何找到正确的edittext?
例如,我有一个大小为10的recylerview,而recyclerview的每一项都包含LinearLayout和linearlayout内部的两项,一项是Edittext,另一项是Button。当我点击第7个项目按钮时,如何获得第7个项目的Edittext的文本?我希望我已经解释清楚了
任何帮助将不胜感激。
答案 0 :(得分:0)
您可以将支架样式用于RecylcerView适配器。然后,您可以在按钮上设置点击监听器,然后从EditText获取文本。
boto3
答案 1 :(得分:0)
第1步:在适配器中创建一个抽象函数。
abstract void onButtonClicked(String text);
第2步:声明您的适配器摘要。
第3步:如果您实例化了适配器,则在您的活动中覆盖方法(onButtonClicked(String text);)。
第4步:在适配器中,在onClickListener内的按钮上调用该函数:
onButtonClicked(editText.getText().toString());
,您将在活动中获得覆盖该方法的字符串。
答案 2 :(得分:0)
您可以在已在回收站视图中设置的适配器内部进行操作。
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
}
});
}
答案 3 :(得分:0)
首先,您需要两个引用:一个指向您的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();
}
});
}
答案 4 :(得分:0)
只需使用您的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
(对于较新的版本)中实现。
答案 5 :(得分:0)
在持有人中使用这样的自定义侦听器:
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)
人们在不知道答案或不理解问题时将-1放置。真有趣!在onclick中,我从视图中获取了parent(getParent())并访问了父级的第二个子级。这样我就可以访问兄弟姐妹的内容。
$('body').on('click','#exit',function(e){
var this_b = $(this).parent().prev().children(0).html();// get the text
alert(this_b);
});