DevOps85
DevOps85

Reputation: 6523

How recreate or refresh fragment

i have fragment for display the NavigationDrawer. In that i have the first section the header with some information. This information change and with EventBus i control this event, but how can update this fragment?

The implementation below work only if i rotate the device.

extract from MainActivity:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main_activity);


        mNavigationNavDrawerFragment = (Nav_DrawerFragment) getFragmentManager().findFragmentById(R.id.fragment_drawer);
        mNavigationNavDrawerFragment.setup(R.id.fragment_drawer, (DrawerLayout) findViewById(R.id.drawer), mToolbar);


        inizialized(mServices);

    }

....
....

  EventBus.getDefault().postSticky(new PersonDetails(mNomeCognome, mEmail));

 //HERE HOW CAN REFRESH OR RECREATE THIS mNavigationNavDrawerFragment?

}

Extract from Nav_DrawerFragment:

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


        View view = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
        mDrawerList = (RecyclerView) view.findViewById(R.id.drawerList);
        LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mDrawerList.setLayoutManager(layoutManager);
        mDrawerList.setHasFixedSize(true);
        final List<NavigationItem> navigationItems = getMenu();

       //HERE I SET THE UPDATE DATA
        Nav_adapter adapter = new Nav_adapter(navigationItems,mNomeCognome,mEmail);
        adapter.setNavigationDrawerCallbacks(this);

        mDrawerList.setAdapter(adapter);
        selectItem(mCurrentSelectedPosition,items);
        return view;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        EventBus.getDefault().registerSticky(this);



    }

    public void onEventMainThread(PersonDetails event){

        mNomeCognome = event.mNomeCognome;
        mEmail = event.mEmail;

    }

public void setup(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {

        mFragmentContainerView = getActivity().findViewById(fragmentId);
        mDrawerLayout = drawerLayout;
        mActionBarDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) {
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
                if (!isAdded()) return;
                getActivity().invalidateOptionsMenu();
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                if (!isAdded()) return;
                getActivity().invalidateOptionsMenu();

            }
        };

Upvotes: 0

Views: 160

Answers (1)

Budius
Budius

Reputation: 39836

I can see you're using a RecyclerView with the adapter

Nav_adapter adapter = new Nav_adapter(navigationItems,mNomeCognome,mEmail);

and then you're updating the values that were used to create the adapter on the event

mNomeCognome = event.mNomeCognome;
mEmail = event.mEmail;

the problem is that you didn't pass those values to the adapter.

So you'll have to create a way to pass those updated values to the existing adapter, something like this:

// first define your adapter as a field:
Nav_adapter adapter;

// then on your event
public void onEventMainThread(PersonDetails event){
   mNomeCognome = event.mNomeCognome;
   mEmail = event.mEmail;
   adapter.setNewValues(mNomeCognome, mEmail);
}

then inside this setNewValues you update the adapter values and don't forget to call one of the notifyItemChanged or notifyItemRangeChanged method on the adapter so that the new value can be updated on the screen.

Upvotes: 1

Related Questions