在viewpager中具有不同内容的相同片段

时间:2016-02-25 05:47:40

标签: android android-fragments android-viewpager fragmentpageradapter

嘿伙计们我遇到了严重的问题。 我有一个父片段,其中有viewpager和tablayout。 Viewpager保存具有与之关联的不同内容的片段。 每次思考都可以在滑动时正常工作,但每当我点击tablayout的不同标签时,SwipableFragment的categoryId和categoryName就会更改为相邻标签的SwipableFragmet到可见片段。

基本上当我启动FragmentAllNews(包含ViewPager)时,它会显示第二个片段/页面而不是第一个片段/页面,当我向第二个片段移动时,我会看到第三个...换句话说它& #39; s始终显示下一个或上一个片段/页面,具体取决于滑动方向(左或右)。

抱歉我的英语不好:(

这是我的Fragments和FragmentStatePagerAdater类

1 FragmentAllNews,其中包含viewpager和tablayout

public class FragmentAllNews extends Fragment {
    @Bind(R.id.tab_layout)
    TabLayout tabLayout;
    @Bind(R.id.all_news_viewpager)
    ViewPager viewPager;

    SessionManager sessionManager;
    String categoryId;
    String categoryName;
    ArrayList<TabModel> tabs;


    public static FragmentAllNews createNewInstance() {
        FragmentAllNews fragmentAllNews = new FragmentAllNews();
        return fragmentAllNews;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sessionManager = new SessionManager(getActivity());
        tabs = sessionManager.getSwitchedNewsValue() == 0 ?
                StaticStorage.getTabData(0) :
                StaticStorage.getTabData(1);
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View fragmentView = inflater.inflate(R.layout.fragment_all_news, container, false);
        ButterKnife.bind(this, fragmentView);
        return fragmentView;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        setViewPager(tabs);
        setTabLayout();
    }

    private void setTabLayout() {
        tabLayout.setupWithViewPager(viewPager);
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());

            }

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

            }

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

            }
        });
    }

    private void setViewPager(ArrayList<TabModel> tabs) {
        ArrayList<NewsFragmentModel> frags = new ArrayList<>();

        for (int i = 0; i < tabs.size(); i++) {
            if (i == 0) {
                categoryId = tabs.get(i).cat_id;
                categoryName = tabs.get(i).cat_name;
                frags.add(new NewsFragmentModel(FragmentBreakingAndLatestNews.createNewInstance(categoryId, categoryName), categoryName));
            } else {
                categoryId = tabs.get(i).cat_id;
                categoryName = tabs.get(i).cat_name;
                frags.add(new NewsFragmentModel(SwipableFragment.createNewInstance(categoryId, categoryName), categoryName));
            }
        }

        NewsPagerAdapter adapter = new NewsPagerAdapter(getChildFragmentManager(),frags);
        viewPager.setAdapter(adapter);

    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ButterKnife.unbind(this);
    }
}

2片段附加到viewpager

的SwipableFragment
public class SwipableFragment extends Fragment implements NewsTitlesAdapter.RecyclerPositionListener {
    @Bind(R.id.recycler_view)
    RecyclerView recyclerView;
    @Bind(R.id.progess)
    ProgressBar progressBar;
    @Bind(R.id.cat_id)
    TextView categoryTextView;

    ArrayList<NewsObj> newsObjs;
    NewsTitlesAdapter newsTitlesAdapter;
    SessionManager sessionManager;

    private static String categoryId;
    private static String categoryName;


    public static SwipableFragment createNewInstance(String category_id, String category_name) {

        SwipableFragment swipableFragment = new SwipableFragment();
        Bundle box = new Bundle();
        box.putString(StaticStorage.NEWS_CATEGORY_ID, category_id);
        box.putString(StaticStorage.NEWS_CATEGORY, category_name);
        swipableFragment.setArguments(box);
        return swipableFragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sessionManager = new SessionManager(getActivity());

        categoryId = getArguments().getString(StaticStorage.NEWS_CATEGORY_ID);
        categoryName = getArguments().getString(StaticStorage.NEWS_CATEGORY);


        newsObjs = (sessionManager.getSwitchedNewsValue() == 0) ?
                NewsData.getNewsRepublica(getActivity()) :
                NewsData.getNewsNagarik(getActivity(),categoryName);

    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_swipable, container, false);
        ButterKnife.bind(this, view);
        return view;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        Log.i("category", categoryId + " " + categoryName);
        categoryTextView.setText(categoryId+" "+categoryName);

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setHasFixedSize(true);
        recyclerView.setItemAnimator(new DefaultItemAnimator());



        newsTitlesAdapter = new NewsTitlesAdapter(newsObjs);
        newsTitlesAdapter.setOnRecyclerPositionListener(this);
        recyclerView.setAdapter(newsTitlesAdapter);

        recyclerView.addOnScrollListener(new EndlessScrollListener(linearLayoutManager) {
            @Override
            public void onLoadMore(int current_page) {
                Log.i("categoryId", categoryId+" "+categoryName);

                categoryTextView.setText(categoryId+" "+categoryName);

                progressBar.setVisibility(View.VISIBLE);

                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {

                        ArrayList<NewsObj> moreNews = sessionManager.getSwitchedNewsValue() == 0 ?
                                NewsData.getNewsRepublica(getContext()) :
                                NewsData.getNewsNagarik(getContext(),categoryName);

                        int curSize = newsTitlesAdapter.getItemCount();
                        newsObjs.addAll(moreNews);
                        newsTitlesAdapter.notifyItemRangeInserted(curSize, newsObjs.size() - 1);
                        progressBar.setVisibility(View.GONE);
                    }
                }, 5000);
            }
        });


    }


    @Override
    public void onChildItemPositionListen(int position, View view) {
        if (view.getId() == R.id.news_share_text_view) {

        } else if (view.getId() == R.id.news_show_detail_text_view) {

        } else {
            Intent newsDetailIntent = new Intent(getActivity(), NewsDetailActivity.class);
            NewsObj newsObj = newsObjs.get(position);
            newsObj.setNewsCategory(categoryName);

            newsDetailIntent.putExtra(NewsDetailActivity.NEWS_TITLE_EXTRA_STRING, newsObj);
            startActivity(newsDetailIntent);
        }
    }
}

3 NewsPagerAdapter是从FragmentStatePagerAdapter扩展的子类

public class NewsPagerAdapter extends FragmentStatePagerAdapter {
    ArrayList<NewsFragmentModel> frags;

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

    public NewsPagerAdapter(FragmentManager fm,ArrayList<NewsFragmentModel> frags){
        super(fm);
        this.frags = frags;
    }
    @Override
    public Fragment getItem(int position) {
        return frags.get(position).getFrag();
    }

    @Override
    public int getCount() {
        return frags.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {

        return frags.get(position).getTitle();
    }
}

4 NewsFragmentModel

public class NewsFragmentModel {
    private Fragment frag;
    private String title;

    public NewsFragmentModel(Fragment frag, String title) {
        this.frag = frag;
        this.title = title;
    }

    public Fragment getFrag() {
        return frag;
    }

    public void setFrag(Fragment frag) {
        this.frag = frag;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

我有任何错误吗?请帮帮我。如果您需要更多信息,请告诉我。我最后的希望是Stackoverflow

0 个答案:

没有答案