如何刷新ViewPager中的片段

问题描述 投票:0回答:2

我进行了很多搜索,但找不到适合于我的代码的解决方案。实际上,我在片段中有tablayout,对于tablayout,我正在使用viewpager。 viewpager内部有3个片段。当用户从微调器中选择项目时,我希望活动中有一个微调器,然后应根据所选值更改viewpager片段数据,但不会更新数据。

任何人都可以帮助解决它。我希望每当更改微调器的选定值时,都应刷新viewpager片段。

我的MainActivity代码:

binding.bottmNav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
            switch (menuItem.getItemId()) {
                case R.id.location:
                    final AlertDialog.Builder mbuilder = new AlertDialog.Builder(HomeActivity.this);
                    View v = getLayoutInflater().inflate(R.layout.dialog_layout, null);
                    Button okbutton = v.findViewById(R.id.okbutton);
                    final Spinner spinner = (Spinner) v.findViewById(R.id.spinner);
                    ArrayAdapter<String> adapter = new ArrayAdapter<String>(HomeActivity.this, android.R.layout.simple_spinner_item,
                            getResources().getStringArray(R.array.countries_list));
                    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                    spinner.setAdapter(adapter);
                    mbuilder.setView(v);
                    final AlertDialog dialog = mbuilder.create();


                   okbutton.setOnClickListener(new View.OnClickListener() {
                       @Override
                       public void onClick(View v) {
                           Log.e("Dialog123", "onClick: Positive" );


                           SharedPreferences prfs;
                           prfs = PreferenceManager.getDefaultSharedPreferences(HomeActivity.this);
                           SharedPreferences.Editor editor = prfs.edit();
                           editor.putString("savedvalue", spinner.getSelectedItem().toString());
                           editor.commit();
                           String text = spinner.getSelectedItem().toString();
                           newsModels = new ArrayList<>();

                           if(text.equals("INDIA")) {
                               newsModels.clear();
                               TypedArray indianewslogo = getResources().obtainTypedArray(R.array.indianews);
                               String[] indianewsname = getResources().getStringArray(R.array.indianewsnames);
                               String[] indianewsurl = getResources().getStringArray(R.array.indiahref);
                               for(int i =0; i<indianewslogo.length(); i++) {
                                   //SendModel sendModel = new SendModel(indianewslogo.getResourceId(i,0),indianewsname[i]);
                                   newsModels.add(new NewsModel(indianewslogo.getResourceId(i,0),indianewsname[i], indianewsurl[i]));
                               }
                               Singleton.getConstant().addNewsModel(newsModels);
                               TypedArray indiashopimg = getResources().obtainTypedArray(R.array.indiashopimg);
                               String [] indishopname = getResources().getStringArray(R.array.indiashopname);
                               String[] indiashopurl = getResources().getStringArray(R.array.indiashopurl);
                               sendModels = new ArrayList<>();
                               for(int j =0; j<indiashopimg.length(); j++){
                                   SendModel sendModel = new SendModel(indiashopimg.getResourceId(j,0), indishopname[j], indiashopurl[j]);
                                   sendModels.add(sendModel);
                               }
                               SendSingleton.getConstant().addNewsModel(sendModels);

                               FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                               fragmentTransaction.replace(R.id.frame_layout, homeFragment);
                               fragmentTransaction.commit();
                               binding.bottmNav.getMenu().findItem(R.id.location).setTitle("India");
                               binding.bottmNav.getMenu().findItem(R.id.home1).setChecked(true);

                               dialog.dismiss();
                           }else if(text.equals("USA")){
                               newsModels.clear();
                               TypedArray indianewslogo = getResources().obtainTypedArray(R.array.usnews);
                               String[] indianewsname = getResources().getStringArray(R.array.usnewsname);
                               String[] indianewsurl = getResources().getStringArray(R.array.usurl);
                               for(int i =0; i<indianewslogo.length(); i++) {

                                   newsModels.add(new NewsModel(indianewslogo.getResourceId(i,0),indianewsname[i], indianewsurl[i]));
                               }
                               Singleton.getConstant().addNewsModel(newsModels);

                               Singleton.getConstant().addNewsModel(newsModels);
                               TypedArray indiashopimg = getResources().obtainTypedArray(R.array.usashopimg);
                               String [] indishopname = getResources().getStringArray(R.array.usashopname);
                               String[] indiashopurl = getResources().getStringArray(R.array.usashopurl);
                               sendModels = new ArrayList<>();
                               for(int j =0; j<indiashopimg.length(); j++){
                                   SendModel sendModel = new SendModel(indiashopimg.getResourceId(j,0), indishopname[j], indiashopurl[j]);
                                   sendModels.add(sendModel);
                               }
                               SendSingleton.getConstant().addNewsModel(sendModels);

                               FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                               fragmentTransaction.replace(R.id.frame_layout, homeFragment);
                               fragmentTransaction.commit();

                               binding.bottmNav.getMenu().findItem(R.id.location).setTitle("USA");
                               binding.bottmNav.getMenu().findItem(R.id.home1).setChecked(true);
                               dialog.dismiss();

                           }

HomeFragment(放置viewpager的位置):

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    final FragmentHomeBinding homeBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false);
    sendModels = new ArrayList<>();

    PagerAdapter pagerAdapter = new PagerAdapter(getChildFragmentManager(), homeBinding.tablayout.getTabCount());
    homeBinding.viewpager1.setAdapter(pagerAdapter);
    homeBinding.tablayout.setupWithViewPager(homeBinding.viewpager1);
    homeBinding.viewpager1.getAdapter().notifyDataSetChanged();
    homeBinding.tablayout.addOnTabSelectedListener(new TabLayout.BaseOnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            homeBinding.viewpager1.setCurrentItem(tab.getPosition());

        }@Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }@Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
    homeBinding.viewpager1.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(homeBinding.tablayout));

NewsFragment(我要在其中显示数据的地方:

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    final FragmentNewsBinding binding= DataBindingUtil.inflate(inflater, R.layout.fragment_news, container,  false);
    View view = binding.getRoot();

    newsModels = new ArrayList<>();
    newsModels =Singleton.getConstant().getNewsModel();

    GridLayoutManager gridLayoutManager =new GridLayoutManager(getContext(), 4);
    binding.recylerview.setLayoutManager(gridLayoutManager);
    binding.recylerview.setItemAnimator(new DefaultItemAnimator());
    RecyclerAdapter adapter = new RecyclerAdapter(newsModels, getContext());
    binding.recylerview.setAdapter(adapter);

    return view;
}

ViewPagerAdapter代码:

public class PagerAdapter extends FragmentPagerAdapter {
private Map<Integer, String> mfragmenttags;
private FragmentManager mfragmentManager;
private String[]  tabtitles= new String[]{"News", "Shopping", "Social"};
private int numofTabs;

public PagerAdapter(@NonNull FragmentManager fm, int numofTabs) {
    super(fm);
    mfragmentManager = fm;
    this.numofTabs = numofTabs;
    mfragmenttags = new HashMap<Integer, String>();
}

@Nullable
@Override
public CharSequence getPageTitle(int position) {
    return tabtitles[position];
}

@NonNull
@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            return new NewsFragment();
        case 1:
            return new ShoppingFragment();
        case 2:
            return new SocialFragment();
        default:
            return null;
    }
}

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
    Object obj = super.instantiateItem(container, position);
    if(obj instanceof Fragment ){
        Fragment f = (Fragment)obj;
        String tag = f.getTag();
        mfragmenttags.put(position, tag);

    }
    return obj;
}
public Fragment getFragment(int position){
    String tag = mfragmenttags.get(position);
    if(tag == null){
        return null;
    }
    return mfragmentManager.findFragmentByTag(tag);
}

@Override
public int getItemPosition(@NonNull Object object) {
    return POSITION_NONE;
}

@Override
public int getCount() {
    return numofTabs;
}

}

android android-fragments android-viewpager
2个回答
0
投票

您应该将所有逻辑代码获取数据(或加载数据)都放在onCreated和onNewIntent上

  • onCreated首次调用
  • 当您再次显示该片段时会调用onNewIntent

希望获得帮助!


0
投票

在要刷新的片段内创建公共方法refresh()。添加以下代码以在微调器的refresh()中调用setOnItemSelectedListener

for (Fragment fragment : getChildFragmentManager().getFragments()) {
     if (fragment instanceof NewsFragment) {
         ((NewsFragment) fragment).refresh(); //add refresh method in fragment
     }

}
© www.soinside.com 2019 - 2024. All rights reserved.