从相同的片段recycler.viewholder onClick()方法访问片段editView

时间:2019-11-16 17:10:02

标签: android android-recyclerview

存在一个片段,该片段的布局由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属性。

1 个答案:

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


相关问题