Search code examples
javaandroidandroid-recyclerviewmapsbottomnavigationview

Change BottomNavigationView with a button inside a RecyclerView Item


The application has a BottomNavigationView for navigating between fragments. One of the Fragments related to the BottomNavigationView has a Fragment as a child containing a RecyclerView and each RecyclerView Item has a Button attached to it.

enter image description here

I would need to navigate the BottomNavigationView to another Fragment with an OnClick of the Button (Highlighted with the red) inside the RecyclerView Item. I have tried different ways but I have not gotten it to work so far. The Click is handled inside the Adapter of the RecyclerView. (The code inside the OnClickListener is just to clarify what I am trying to do.)

 @Override
    public void onBindViewHolder(@NonNull LocationsViewHolder holder, int position) {
        ...

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

            
              BottomNavigationView navigation = (BottomNavigationView)v.findViewById(R.id.nav_view);
                navigation.setSelectedItemId(R.id.navigation_map);

                    }
        });
    }

Solution

  • The easiest way is created an interface implemented by your Activity

    First create an interface that i called OnItemClick :

    public interface OnItemClick{
    
        void onItemClick();
    }
    

    Following on your activity implement this interface like below :

    public class MainActivity extends AppCompatActivity implements OnItemClick{
    
        /*
            rest of your code
        */
    
        @Override
        public void onItemClick() {
            navigation.setSelectedItemId(R.id.navigation_map);
        }
    }
    

    On your Fragment you need to pass the Activity into your Adapter

    YourAdapter adapter = new YourAdapter(requireActivity());
    

    And on your adapter you need to initialize the interface like below :

     OnItemClick listener;
    
     public YourAdapter(Activity activity) {
            listener= ((MainActivity) activity);
        }
    

    And finaly to call the method on your activity just call it like below

     @Override
        public void onBindViewHolder(@NonNull LocationsViewHolder holder, int position) {
            ...
    
            holder.showMarkerButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                         listener.onItemClick();
    
                     }
            });
        }