1

I want to send an audio file from the adapter class to fragment that is retrieved from the firebase database in a fragment.

Here is my code for the Adapter class.

recyclerViewAdapter.java

public class recyclerViewAdapter extends FirebaseRecyclerAdapter<model, recyclerViewAdapter.recyclerViewHolder> {

public recyclerViewAdapter(@NonNull FirebaseRecyclerOptions<model> options) {
    super(options);
}

@Override
protected void onBindViewHolder(@NonNull recyclerViewAdapter.recyclerViewHolder holder, int position, @NonNull model model) {

    holder.recycler_view_title.setText(model.getTitle());
    Glide.with(holder.recycler_view_image.getContext()).load(model.getImageUrl()).into(holder.recycler_view_image);

    holder.recycler_view_image.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            AppCompatActivity appCompatActivity = (AppCompatActivity) v.getContext();
            appCompatActivity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new DescriptionFragment(model.getTitle(), model.getDescription(), model.getImageUrl(), model.getAudioUrl())).addToBackStack(null).commit();

        }
    });

}

@NonNull
@Override
public recyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_row_design, parent, false);

    return new recyclerViewHolder(view);
}

public class recyclerViewHolder extends RecyclerView.ViewHolder {

    private ImageView recycler_view_image;
    private TextView recycler_view_title;

    public recyclerViewHolder(@NonNull View itemView) {
        super(itemView);

        recycler_view_image = itemView.findViewById(R.id.recycler_view_image);
        recycler_view_title = itemView.findViewById(R.id.recycler_view_title);

    }

}

}

Marsad
  • 859
  • 1
  • 14
  • 35
  • Does this answer your question? [How to pass or send data from recyclerview adapter to fragment](https://stackoverflow.com/questions/52829707/how-to-pass-or-send-data-from-recyclerview-adapter-to-fragment) – Usama Altaf Jun 25 '21 at 08:01
  • Check this https://stackoverflow.com/questions/56826346/kotiln-pass-data-from-adapter-to-activity/56827414#56827414 – milad salimi Jun 25 '21 at 08:03
  • What exactly in this code doesn't work the way you expect? Tell us what is wrong with shared code. Do you have any errors? – Alex Mamo Jun 25 '21 at 08:05
  • Thanks to all !!! Alex Mamo there is no error in the code, I only asking how to do that. – Aryan Yadav Jun 25 '21 at 08:19

1 Answers1

0

To send data between adapter class to fragment use interface

Create interface inside adapter class

    OnDataSend dataSend;

    public interface OnDataSend {
        void onSend(String audioURL);
    }

    public void OnDataSend(OnDataSend dataSend){
        this.dataSend = dataSend;
    }
   

To send data put this in the adapter class

    //To send data call 
    dataSend.onSend(/*Pass you data*/);

To receive data in the fragment

    recyclerViewAdapter recyclerViewAdapter = new recyclerViewAdapter(/*...*/);
    recyclerViewAdapter.OnDataSend(new recyclerViewAdapter.OnDataSend() {
        @Override
        public void onSend(String audioURL) {

          //data received...

        }
    });

Detailed Answer

public class recyclerViewAdapter extends FirebaseRecyclerAdapter<model, recyclerViewAdapter.recyclerViewHolder> {

    OnDataSend dataSend;

    public recyclerViewAdapter(@NonNull FirebaseRecyclerOptions<model> options) {
        super(options);
    }

    public void OnDataSend(OnDataSend dataSend) {
        this.dataSend = dataSend;
    }

    @Override
    protected void onBindViewHolder(@NonNull recyclerViewAdapter.recyclerViewHolder holder, int position, @NonNull model model) {

        holder.recycler_view_title.setText(model.getTitle());
        Glide.with(holder.recycler_view_image.getContext()).load(model.getImageUrl()).into(holder.recycler_view_image);

        holder.recycler_view_image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                AppCompatActivity appCompatActivity = (AppCompatActivity) v.getContext();
                appCompatActivity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new DescriptionFragment(model.getTitle(), model.getDescription(), model.getImageUrl(), model.getAudioUrl())).addToBackStack(null).commit();

                
                //send data
                dataSend.onSend(model.getAudioUrl());
                
                
            }
        });

    }

    @NonNull
    @Override
    public recyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_row_design, parent, false);

        return new recyclerViewHolder(view);
    }

    public interface OnDataSend {
        void onSend(String audioURL);
    }

    public class recyclerViewHolder extends RecyclerView.ViewHolder {

        private ImageView recycler_view_image;
        private TextView recycler_view_title;

        public recyclerViewHolder(@NonNull View itemView) {
            super(itemView);

            recycler_view_image = itemView.findViewById(R.id.recycler_view_image);
            recycler_view_title = itemView.findViewById(R.id.recycler_view_title);

        }

    }
}

Marsad
  • 859
  • 1
  • 14
  • 35
  • Firstly thanks Marsad for your answer but I have a doubt, Don't we need to change anything in fragment java code? – Aryan Yadav Jun 25 '21 at 11:57
  • @AryanYadav please check my updated answer – Marsad Jun 25 '21 at 14:54
  • ok, but you only tell how to send data, please tell how to get that data. – Aryan Yadav Jun 25 '21 at 16:47
  • @AryanYadav I put that code in my answer (wanna take a look again). – Marsad Jun 25 '21 at 20:27
  • ohh sorry , I didn't see that. Thanks man, but it is showing error in dataSend.onSend(model.getAudioUrl()). – Aryan Yadav Jun 26 '21 at 04:03
  • Hope you add this line in right place. BTW, what's the error... – Marsad Jun 26 '21 at 05:36
  • Yes I have added this line on the place where you said to add! App crashes and when I check logcat it shows error in this line – Aryan Yadav Jun 26 '21 at 05:58
  • What's in the logcat. Can you copy paste here. – Marsad Jun 26 '21 at 06:19
  • This is the error => java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.firstapplication.recyclerViewAdapter$OnDataSend.onSend(java.lang.String)' on a null object reference at com.example.firstapplication.recyclerViewAdapter$1.onClick(recyclerViewAdapter.java:59) – Aryan Yadav Jun 26 '21 at 08:20
  • ```if (dataSend != null) { dataSend.onSend(model.getAudioUrl()); }``` – Marsad Jun 26 '21 at 10:46
  • Bro!, there is one last problem, .... recyclerViewAdapter recyclerViewAdapter = new recyclerViewAdapter(); <= this line of code shows red line between paranthesis of recyclerViewAdapter means it wants something ..... Please solve this one also, YOURS FAITHFULLY..., THANKS – Aryan Yadav Jun 26 '21 at 12:21
  • Pass ```FirebaseRecyclerOptions options...``` inside (...) – Marsad Jun 26 '21 at 16:18
  • After that also it is showing error, "options" is in red color – Aryan Yadav Jun 26 '21 at 16:38
  • Bro please solve this, it will be a great help for me, humble request. – Aryan Yadav Jun 27 '21 at 06:57
  • 1
    Dear, pass ```FirestoreRecyclerOptions*model*/> options = new FirestoreRecyclerOptions.Builder*model*/>() .setQuery(/*query*/, /*model.class here*/) .build();``` in ```... = new recyclerViewAdapter(options); ``` – Marsad Jun 27 '21 at 09:36
  • It's not due to that,I have already check by this, Sorry that was my mistake, I have found now what was that, Thanks for your help! – Aryan Yadav Jun 27 '21 at 13:27