Как обновить sh Фрагмент внутри ViewPager - PullRequest
0 голосов
/ 04 апреля 2020

Я много искал, но не могу найти решение, которое подойдет для моего кода. На самом деле у меня есть tablayout во фрагменте и для tablayout я использую viewpager. Внутри окна просмотра есть 3 фрагмента. В моей деятельности есть один счетчик, который мне нужен, когда пользователь выбирает элемент из счетчика, после чего данные фрагментов окна просмотра должны быть изменены в соответствии с выбранным значением, но данные не обновляются.

Может ли кто-нибудь помочь в его решении. Я хочу, чтобы фрагмент видового пейджера обновлялся всякий раз, когда будет изменено выбранное значение прядильщика.

Мой код 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 (где находится видоискатель):

@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;
}

}

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Создайте publi c методов refresh() внутри ваших фрагментов, которые вы хотите обновить sh. Добавьте приведенный ниже код для вызова refresh() внутри вашего setOnItemSelectedListener счетчика

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

}
0 голосов
/ 04 апреля 2020

Вы должны поместить все логические c данные выборки кода (или данные загрузки) в обоих местах: onCreated и onNewIntent

  • onCreated вызывается в первый раз
  • onNewIntent вызывается когда ты снова покажешь этот фрагмент

Надеюсь, это поможет!

...