Ad

OnClickListener For The Recycler View Returns Nothing

- 1 answer

I'm a beginner and I'm trying to build a simple voice recorder app. I've already posted on the website concerning the access of external storage. This problem is now solved but I've an another one concerning my RecyclerView.

I've followed a tutorial online in order to detect which view is clicked and play the audio accordingly (I use my RecyclerView to display all the recording files just created). Here's the tutorial in question : https://www.youtube.com/watch?v=ZXoGG2XTjzU

The problem is, the 'OnNoteClick' does absolutely nothing. How can I fix this ?

I created an interface with a function 'OnNoteClick' attached to it. I implemented this function in mainactivity.java. Basically, I've followed the tutorial.

\\\ Adapter Code
private OnNoteListener mOnNoteListener;

...

public RecyclerViewAdapter(@NonNull ArrayList<String> text, Context context, OnNoteListener onNoteListener) {
        Text = text;
        this.context = context;
        this.mOnNoteListener = onNoteListener;
    }
...
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cardview, viewGroup, false);
        ViewHolder holder = new ViewHolder(view, mOnNoteListener);
        return holder;
    }
...
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        TextView textView;
        CardView ParentLayout;
        OnNoteListener onNoteListener;
        public ViewHolder(@NonNull View itemView, OnNoteListener onNoteListener) {
            super(itemView);
            textView = itemView.findViewById(R.id.cardtext);
            ParentLayout = itemView.findViewById(R.id.cardview);
            this.onNoteListener = onNoteListener;
            ParentLayout.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            onNoteListener.onNoteClick(getAdapterPosition());
        }
    }
    public interface OnNoteListener{
        void onNoteClick(int position);
    }

}
...
\\\ MainActivityCode
public class FileAndDirectoryActivity extends AppCompatActivity implements RecyclerViewAdapter.OnNoteListener {
...
private void initRecyclerView() {
        RecyclerView recyclerView = findViewById(R.id.recyclerview);
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(mNames, this, this);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
    }
...
    @Override
    public void onNoteClick(int position) {
        Toast.makeText(this, "Good News : I'm working", Toast.LENGTH_SHORT).show();
    }
}
...

I expect the app to show a message reading "I'm working" or something like that but in reality, when i touch the cardview, nothing happens.

Ad

Answer

Your problem is in:

public void onBindViewHolder(@NonNull ViewHolder holder, int i) {
    holder.textView.setText(Text.get(i));
    holder.ParentLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d(TAG, "onClick: Click on this card !");
        }
    });
}

You set a new click listener on ParentLayout so it overwrites click listener that you set in constructor. Try it without and it should work:

public void onBindViewHolder(@NonNull ViewHolder holder, int i) {
    holder.textView.setText(Text.get(i));
}
Ad
source: stackoverflow.com
Ad