Как обновлять список всякий раз, когда вкладки меняются в режиме просмотра пейджера

В моем приложении я использую вкладку навигации с помощью пейджера вида. Я смог успешно нарисовать вкладки, используя код, размещенный на:

https://github.com/codepath/android_guides/wiki/Sliding-Tabs-with-PagerSlidingTabStrip

Здесь я использовал вкладку "Слайдинг" и просмотрел пейджер как для получения вкладок навигации. Все работает нормально, но список не обновляется, когда я перехожу на другую вкладку. OnResume() получает вызов, даже переменная списка объектов также обновляется во время отладки, но визуальный список не обновляется.

Вот некоторые фрагменты кода:

Для Tab1: в моем случае вкладка ACTIVE

 @Override
    public void onResume() {
        super.onResume();

        if(!internetUtil.isConnectedToInternet(getActivity())){
            mSwipeRefreshLayout.setEnabled(false);
        }else{
            mSwipeRefreshLayout.setEnabled(true);
            new GetUsersFromServerTask().execute();  // Here i am making the network calls 
        }
}

Вкладка Tab2: вкладка "Архив"

 @Override
    public void onResume() {
        super.onResume();
        new GetUsersArchivedFromServerTask().execute(); // Network calls
    }

В MainActivity:

public class MaterialTab extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.material_main_sample);
        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(new SampleFragmentPagerAdapter(getSupportFragmentManager()));
        PagerSlidingTabStrip tabsStrip = (PagerSlidingTabStrip) findViewById(R.id.tabs);
        tabsStrip.setViewPager(viewPager);
        tabsStrip.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                if(position == 0){
                   ActiveFragment activeFragment = new ActiveFragment();
                    final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                    ft.detach(activeFragment);
                    ft.attach(activeFragment);
                    ft.commit();
                } if(position == 1){
                    ArchiveFragment archiveFragment = new ArchiveFragment();
                    final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                    ft.detach(archiveFragment);
                    ft.attach(archiveFragment);
                    ft.commit();
                }
            }
        });
    }
}

Также, когда я делаю SwipeRefresh, список обновляется. Теперь я совершенно смущен, почему такое поведение. Когда я просматриваю вкладку, вызываются те же методы, и список не обновляется, но когда я делаю SwipeRefresh, он становится обновленным.

Это активный фрагмент:

public class ActiveFragment extends Fragment {

public void updateFragment(){
        new GetUsersArchivedFromServerTask().execute();
    }

 public class GetUsersArchivedFromServerTask extends AsyncTask<User, Void, String> {
        @Override
        protected String doInBackground(Shipment... parmas) {
            // Log.d(TAG, String.valueOf(shipmentDbHandler.getAllActiveShipments().size()));
            _userList1 = userDbHandler.getAllActiveUserByToday(DateTimeUtil.getCurrentTime());
            return "";
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(String str) {
            // Set the refresh Listener to false after the list has been loaded with new set of data
            if (mSwipeRefreshLayout.isRefreshing()) {
                mSwipeRefreshLayout.setRefreshing(false);
            }

            if(_userList1.size() == 0){
                ViewGroup parentOne = (ViewGroup) viewOne.getParent();
                if(parentOne != null){
                    parentOne.removeView(viewOne);
                }
            }

            if(_shipmentList1.size() > 0 ){
                mShipmentAdapter = new ShipmentAdapter(getActivity(),_userList1,1); 
                shipmentListView1.setAdapter(mShipmentAdapter);
                setListViewHeightBasedOnChildren(shipmentListView1);
                ViewGroup parentOne = (ViewGroup) viewOne.getParent();
                if(parentOne == null){
                    mainLayoutOne.addView(viewOne);
                }

                mShipmentAdapter.notifyDataSetChanged();
            }
            mSwipeRefreshLayout.setClickable(true);
        }
    }
}   

Ответ 1

PLease использует FragmentStatePagerAdapter для этого.

Ответ 2

Ваш OnPageChangeListener завинчивается с фрагментами. Каждый раз, когда вы выбираете страницу, вы создаете новый Fragment и всегда добавляете его. Вы пытаетесь отсоединить новый Fragment, который еще не подключен. Его полностью перепутали. Ваш SampleFragmentPagerAdapter будет обрабатывать эти транзакции фрагментов для вас. Поэтому просто удалите setOnPageChangeListener, и все будет хорошо.

Ответ 3

Вот простое и эффективное решение для вас. Просто замените setOnPageChangeListener следующим образом: здесь мы получаем экземпляр текущего фрагмента с помощью getSupportFragmentManager и вызываем соответствующий метод фрагмента.

    tabsStrip.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            Fragment currentFragment = getSupportFragmentManager()
                    .findFragmentByTag(
                            "android:switcher:" + R.id.viewpager + ":"
                                    + mViewPager.getCurrentItem());
            if (currentFragment instanceof ActiveFragment) {
                ((ActiveFragment) currentFragment).updateFragment();
            } else if (currentFragment instanceof ArchiveFragment) {
                ((ArchiveFragment) currentFragment).updateFragment();
            }
        }
    });

И внутри вашего соответствующего фрагмента добавьте метод updateFragment().

public void updateFragment() {
    Toast.makeText(getActivity(), "ActiveFragment", Toast.LENGTH_SHORT)
            .show();
    // make updates over here
    // new GetUsersArchivedFromServerTask().execute(); // Network calls
}

Ссылка .

Ответ 4

  • удалить onPageSelected(...) коды из смены страницы listerner, не нужно устанавливать/раскручивать вручную, ViewPager позаботиться об этом автоматически. А также ваш SampleFragmentPagerAdapter должен создать каждый экземпляр фрагмента в getItem(...).

  • new GetUsersFromServerTask().execute() должен вызываться в каждом фрагменте onCreateView, а затем обновлять представление после Asynctask done.


Кроме того, вы должны знать OffscreenPageLimit:

public void setOffscreenPageLimit (int limit)

Задайте количество страниц, которые должны быть сохранены в обе стороны текущей страницы в иерархии представлений в состоянии ожидания. Страницы, выходящие за этот предел, будут воссозданы из адаптера, когда это необходимо.

Это предлагается как оптимизация. Если вы заранее знаете количество страниц, которые вам понадобятся для поддержки или имеют механизмы ленивой загрузки на ваших страницах, настройка этой настройки может принести пользу в воспринимаемой гладкости анимации и взаимодействия пейджинга. Если у вас есть небольшое количество страниц (3-4), которые вы можете сохранить активными одновременно, меньше времени будет потрачено на макет для вновь созданных подтипов просмотра в качестве страниц пользователя взад и вперед.

Вы должны держать этот предел низким, особенно если ваши страницы имеют сложные макеты. По умолчанию этот параметр равен 1.

Ответ 5

Используйте это внутри фрагмента.

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if (isVisibleToUser) {
        // Do your code here
    }
}

Этот метод вызывается каждый раз, когда вкладка видима пользователю. Надеюсь, что это решит вашу проблему!!!!

Ответ 6

Попробуйте использовать notifyDataChange или notifyall

Ответ 7

Переопределить setPrimaryItem() и вызвать метод refresh() вашего фрагмента в позиции. setPrimaryItem() вызывается каждый раз, когда выбранный элемент изменяется в viewPager. Его можно назвать более одного раза, так что вам тоже придется его обрабатывать. см. setPrimaryItem

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