简体   繁体   English

如何重新创建或刷新片段

[英]How recreate or refresh fragment

i have fragment for display the NavigationDrawer. 我有用于显示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? 这些信息会发生变化,并且通过EventBus我可以控制此事件,但是如何更新此片段?

The implementation below work only if i rotate the device. 仅当我旋转设备时,以下实施方式才能工作。

extract from MainActivity: 从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: 从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();

            }
        };

I can see you're using a RecyclerView with the adapter 我可以看到您正在使用带有适配器的RecyclerView

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. 然后在此setNewValues内部更新适配器值,并且不要忘记调用适配器上的notifyItemChangednotifyItemRangeChanged方法之一,以便可以在屏幕上更新新值。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM