ViewPager не обновляет RecylcerView внутри каждой вкладки при переключении

У меня есть ViewPager, который я настроил в простом примере приложения. У меня есть один статический фрагмент, реализованный как внутренний класс с RecylerView в нем. Я хотел бы изменить LayoutManager RecyclerView в зависимости от того, на какой вкладке я нахожусь. Моя реализация показана ниже. Это не работает для меня. Когда я загружаю этот ViewPager, он запускается с 1-й позиции, но имеет шахматную компоновку (которая должна быть для 3-й позиции). Когда я прокручиваю до 2-й позиции, это все еще ступенчатый макет, ничего не изменилось, так как метод getItem() моего PagerAdapter никогда не вызывался. Когда я переключаюсь на 3-ю позицию, вызывается getItem(), и RecylerView перезагружается, однако он все еще имеет шахматную компоновку (именно здесь она должна иметь шахматную компоновку).

Немного почитав ViewPagers, я понял, что PagerAdapter будет повторно использовать фрагмент, если решит, что может. Я думаю, что это то, что здесь происходит. Есть ли способ предотвратить это? Могу ли я заставить свой LayoutManager переключаться для каждой вкладки, используя только один фрагмент? По сути, я хочу, чтобы он создавал новый фрагмент для каждой вкладки.

public class TabbedActivity extends AppCompatActivity {

    /**
     * The {@link android.support.v4.view.PagerAdapter} that will provide
     * fragments for each of the sections. We use a
     * {@link FragmentPagerAdapter} derivative, which will keep every
     * loaded fragment in memory. If this becomes too memory intensive, it
     * may be best to switch to a
     * {@link android.support.v4.app.FragmentStatePagerAdapter}.
     */
    private SectionsPagerAdapter mSectionsPagerAdapter;

    /**
     * The {@link ViewPager} that will host the section contents.
     */
    private ViewPager mViewPager;

    public static Intent newIntent(Context packageContext){
        Intent intent = new Intent(packageContext, TabbedActivity.class);
        return intent;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tabbed);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        // Create the adapter that will return a fragment for each of the three
        // primary sections of the activity.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_tabbed, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public static class RecyclerFragment extends Fragment {

        private static final String ARG_LAYOUT_TYPE = "layout-type";

        private int layoutType = 0;

        RecyclerView recyclerView;
        public ArrayList<AndroidVersion> data;
        public DataAdapter adapter;

        public static final int FRAGMENT_LINEAR = 0;
        public static final int FRAGMENT_GRID = 1;
        public static final int FRAGMENT_STAG_GRID = 2;

        public static RecyclerFragment newInstance(int layoutType) {
            Timber.d("newInstance() called with int: " + layoutType);
            RecyclerFragment fragment = new RecyclerFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_LAYOUT_TYPE, layoutType);
            fragment.setArguments(args);
            return fragment;
        }

        @Override
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);

            if(getArguments() != null){
                layoutType = getArguments().getInt(ARG_LAYOUT_TYPE);
            }
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
            View rootView = inflater.inflate(R.layout.fragment_linear, container, false);

            Button button = (Button) rootView.findViewById(R.id.view_pager_button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent mainActivityIntent = MainActivity.newIntent(getActivity().getApplicationContext());
                    startActivity(mainActivityIntent);
                }
            });

            recyclerView = (RecyclerView) rootView.findViewById(R.id.card_recyler_view_pager);
            //recyclerView.setHasFixedSize(true);

            // Check to see what the layout type should be and create the necessary LayoutManager
            switch(layoutType){
                case FRAGMENT_LINEAR:
                    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
                    recyclerView.setLayoutManager(layoutManager);
                case FRAGMENT_GRID:
                    GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 3);
                    recyclerView.setLayoutManager(gridLayoutManager);
                case FRAGMENT_STAG_GRID:
                    StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
                    recyclerView.setLayoutManager(staggeredGridLayoutManager);
            }

            loadJSON();

            return rootView;
        }

        private void loadJSON() {
            Retrofit retrofit = MainActivity.getRestAdapter();
            RequestInterface request = retrofit.create(RequestInterface.class);
            Call<JSONResponse> call = request.getJSON();
            call.enqueue(new Callback<JSONResponse>() {
                @Override
                public void onResponse(Call<JSONResponse> call, Response<JSONResponse> response) {
                    JSONResponse jsonResponse = response.body();
                    data = new ArrayList<>(Arrays.asList(jsonResponse.getAndroid()));
                    adapter = new DataAdapter(data);
                    recyclerView.setAdapter(adapter);
                }

                @Override
                public void onFailure(Call<JSONResponse> call, Throwable t) {
                    Log.d("Error", t.getMessage());
                }
            });
        }

    }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */
    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            Timber.d("getItem called, position: " + position);
            return RecyclerFragment.newInstance(position);
        }

        @Override
        public int getCount() {
            // Show 3 total pages.
            return 3;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "Linear";
                case 1:
                    return "Grid";
                case 2:
                    return "Staggered";
            }
            return null;
        }
    }
}

person intA    schedule 01.07.2017    source источник
comment
поставить обновления на ViewPager#addOnPageChangeListener   -  person Jaydeep Devda    schedule 01.07.2017
comment
Однако я не могу напрямую обновить фрагмент из действия ViewPager, поскольку это статический фрагмент. Я попытался вызвать sectionsPagerAdapter.getItem(position) из вызова addOnPageChangeListener(), но это ничего не изменило.   -  person intA    schedule 01.07.2017


Ответы (1)


Попробуй это :

внутри класса RecyclerFragment определите статическую переменную:

частный статический экземпляр RecyclerFragment = null;

и измените метод newInstance, как показано ниже:

public static RecyclerFragment newInstance(int layoutType) {
            Timber.d("newInstance() called with int: " + layoutType);
            instance =new RecyclerFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_LAYOUT_TYPE, layoutType);
            instance.setArguments(args);
            return instance;
        }
person Karim    schedule 01.07.2017