如何动态更新片段?

时间:2016-01-15 14:56:29

标签: android android-fragments android-viewpager android-tabs android-tablayout

我正在使用带有视图寻呼机的Tab布局并动态添加片段。现在我需要更新TextView片段中存在的ViewPager,根据片段的滑动或单击制表符。假设我点击第一个标签或滑动我的片段,TextView片段中的OperatorPlanList更新为“I just click”之类的文本。

注意 - TextView存在于片段的布局中。

当我尝试使用获取视图方法position中的FragmentStatePageAdapter来查找位置时,我发现它在看到第一个或最后一个片段时两次更新位置。

那么如何根据ViewPager ???

中屏幕上显示的当前片段动态更新我的片段

这是我的FragmentStatePagerAdapter适配器。

class ViewPagerFinder extends FragmentStatePagerAdapter {

        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerFinder(FragmentManager manager) {
            super(manager);

        }
        @Override
        public Fragment getItem(int position){
            return  mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            System.out.println("getcount>>>" + mFragmentList.size());
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            return super.instantiateItem(container, position);
        }

        @Override
        public void setPrimaryItem(ViewGroup container, int position, Object object) {
            super.setPrimaryItem(container, position, object);
        }


        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }

    }

这就是我设置ViewPager的方式。

 private void setupViewPager(ViewPager viewPager) {
            adapter = new ViewPagerFinder(getSupportFragmentManager());
            for(int i = 0; i<numberOfPlans;i++){
                adapter.addFragment(new OperatorPlanList(),"Plan");

//This is how I am setting up my fragments.

                viewPager.setAdapter(adapter);
            }

        }

这就是我设置Tab的方式。

 private void setupTabIcons() {
        System.out.println("number of plans ="+numberOfPlans);
        for(int i = 0; i<numberOfPlans;i++){
            HashMap<String,String> map = applist.get(i);
            String planName = map.get("plan_name");
            TextView tabOne = (TextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null);
            tabOne.setText(planName);
            tabLayout.getTabAt(i).setCustomView(tabOne);

        }
    }

这就是我调用方法的方法。

viewPager = (ViewPager)findViewById(R.id.viewpager);
                    setupViewPager(viewPager);

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

                    setupTabIcons();

1 个答案:

答案 0 :(得分:1)

创建一个所有选项卡片段将实现的接口

public interface TabFragment {
    void onTabSwiped(int position);
}

在托管ViewPager的类中,它实现inline* level

在ViewPagerFinder中,在instantiateItem()期间保留一个TabFragment列表(创建片段并将其转换为新界面,然后调用super)。

现在在实现OnPageChangeListener的类中,在所有TabFragments上调用onTabSwiped方法,该方法在覆盖方法onPageSelected(int position)内的位置传递。

现在,您将在滑动过程中收到每个片段的回调信息,这样您就可以检查其是否正确,并执行正确页面时需要执行的操作。

有一些方法可以提高效率,但这只是让它运转起来的快捷方式。这一切都很相似

- 你也可以在onPageSelected(int position)中从你的适配器中的列表中获取片段,然后调用接口方法。

@Override
public void onPageSelected(int position){
    pagerAdapter.mFragmentList.get(position).onTabSwiped();
}