【问题标题】:How to refresh Fragment inside ViewPager如何在 ViewPager 中刷新 Fragment
【发布时间】:2020-04-04 14:09:24
【问题描述】:

我进行了很多搜索,但找不到适合我的代码的解决方案。 实际上我在片段中有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


【解决方案1】:

你应该把所有逻辑代码获取数据(或加载数据)放在onCreated和onNewIntent这两个地方

  • 第一次调用onCreated
  • onNewIntent 在你再次显示该片段时被调用

希望对您有所帮助!

【讨论】:

  • 您只需将重新加载数据的所有逻辑代码放在 onCreated 和 onNewIntent 中。我在上面解释过。它对我有用。
  • 实际上数据正在 recyclerview 中,但是当我单击微调器并选择任何项目时,它不会使用新数据进行更新。为什么会这样?
  • 我希望 viewpager 片段在每次从微调器中选择后刷新。
  • 每次你在微调器中选择项目。比如你选择一个片段。因此,如果创建了该片段。它将调用 onNewIntent。否则它将调用 onCreated。所以你只需要更新这两个函数的数据。对吗?
【解决方案2】:

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

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

}

【讨论】:

  • 我应该在 refresh() 方法中写什么??
  • 您想要更改该片段内数据的逻辑
  • 如果是recyclerview代码我想写在片段中,那么refresh()方法应该返回什么?
  • 做 binding.notifyDataSetChanged();或再次创建并设置适配器
  • 我试过你的代码,但它没有帮助我...数据没有刷新每一项微调。
猜你喜欢
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多