存在一个片段,该片段的布局由EditView和RecyclerView组成。
回收站ViewHolder实现了View.OnClickListener来捕获回收站的行点击。
我的问题是如何从定义的ViewHolder.OnClick(View v)中访问EditView对象
@Override
public void onClick(View view) {
editText.setText(R.string.any_txt);
}
错误点在ViewHolder构造函数内部。
public MyViewHolder(View v) {
super(v);
v.setOnClickListener(this);
editText = v.findViewById(R.id.editText); //editText is always NULL, inaccessible
}
我了解这里的视图v是找不到我的视图
R.id.editText
我该如何解决?
下面是演示View的片段布局。在这里您可以找到editView和recyclerView(具有我正在谈论的ViewHolder)
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/groupsLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/editTextGroups"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_add_group"
android:imeOptions="actionDone"
android:inputType="textCapSentences|textAutoCorrect"
android:textAlignment="center"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerViewGroups"
android:layout_width="match_parent"
android:layout_height="0dp"
android:scrollbars="vertical"
app:layout_constraintBottom_toTopOf="@+id/textTopGroups"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editTextGroups">
</androidx.recyclerview.widget.RecyclerView>
<TextView
android:id="@+id/textTopGroups"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:textAlignment="viewStart"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
可能的短路问题是如何在回收站行单击上设置editView.text?
想添加Ive实现的onClick和OnLongClick都可以工作。重点仅在于如何投射editView.text属性。
答案 0 :(得分:1)
您可以通过抽象来实现。这是一个示例:
适配器
public class FruitsAdapter extends RecyclerView.Adapter<FruitsAdapter.MyViewHolder> {
OnFruitClickListener listener;
List<ModelFruits> fruits;
Context context;
public FruitsAdapter(List<ModelFruits> fruits, Context context) {
this.fruits = fruits;
this.context = context;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_fruits, parent, false);
MyViewHolder myViewHolder = new MyViewHolder(view);
return myViewHolder;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder,final int position) {
Glide.with(context)
.load(fruits.get(position).getImage())
.into(holder.image);
holder.name.setText(fruits.get(position).getName());
//Here we pass our data to the onClick method of our inteface
holder.root.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onClick(R.string.anytext);
}
});
}
@Override
public int getItemCount() {
return fruits.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
ImageView image;
TextView name;
CardView root;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.im_image);
name = itemView.findViewById(R.id.tv_name);
root = itemView.findViewById(R.id.root);
}
}
// a method to intialize the interface
public void fruitOnClick(OnFruitClickListener listener)
{
this.listener = listener;
}
public interface OnFruitClickListener{
void onClick(String text);
}
}
片段
RecylerView recyclerView = view.findViewById(R.id.recyclerView);
TextView myTextView = view.findViewById(R.id.myTextView);
recyclerView.setLayoutManager(new GridLayoutManager(this,2));
adapter = new FruitsAdapter(DataSource.fruits,this);
recyclerView.setAdapter(adapter);
adapter.fruitOnClick(new FruitsAdapter.OnFruitClickListener() {
@Override
public void onClick(String text) {
myTextView.setText(text);
}
});