Search code examples
javaandroidandroid-recyclerviewonitemclicklistener

Pass String from Adapter to Fragment using interface


This is question is based on this answer.

I'm trying to pass a string from my RecyclerView.Adapter to my fragment.

In my adapter I added the following:

onItemClickListner onItemClickListner;

public void setOnItemClickListner(VideoAdapter.onItemClickListner onItemClickListner) {
    this.onItemClickListner = onItemClickListner;
}

public interface onItemClickListner{
    void onClick(String str);//pass your object types.
}

I pass the following string once the amount of items in my adapter is less then one (adapter is empty):

onItemClickListner.onClick("TESTING");

Then, in my fragment I add the following:

//I do the following after setting my adapter
videoAdapter.setOnItemClickListner(new VideoAdapter.onItemClickListner() {
        @Override
        public void onClick(String str) {
            Toast.makeText(getActivity(), str, Toast.LENGTH_SHORT).show();
        }
    });

For some reason the string is empty/null and the crash points to onItemClickListner.onClick("TESTING");.

Can someone please have a look and see what I might be doing wrong?


Edit:

I call onItemClickListner.onClick("TESTING"); inside my OnMenuItemClickListener as shown below:

popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {

        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {

                case R.id.delete:

                    onItemClickListner.onClick("TESTING");

                return true;

}

I did not provide my entire fragment because I just add the above inside onCreateView.


Solution

  • Firstly, thank you for all the answers and comments.

    I fixed this issue by doing the following.


    In my Adapter I added the following:

    private UpdateInterface listner;
    
    public interface UpdateInterface {
        void recyclerviewOnUpdate(int amount);
    }
    
    public VideoAdapter(Context context, ArrayList<PathModel> thumbPathList, ArrayList<PathModel> videoPathList, UpdateInterface listner) {
        this.context = context;
        this.thumbPathList = thumbPathList;
        this.videoPathList = videoPathList;
        //I added this
        this.listner=listner;
    }
    

    I call the interface the same way as I did in my question:

    //Passing the amount of items in adapter
    listner.recyclerviewOnUpdate(getItemCount());
    

    It's very similar to what I've done above but now I implement the interface in my fragment like this:

    public class VideoFragment extends Fragment implements VideoAdapter.UpdateInterface
    

    and now I have a method to work with, shown below:

    @Override
    public void recyclerviewOnUpdate(int amount) {
        //Now I can get the int and check if the adapter is empty after removing a item
        if (amount<1) {
            txtEmptyAdapter.setVisibility(View.VISIBLE);
        }
    }