【问题标题】:How to update fragments dynamically?如何动态更新片段?
【发布时间】:2016-01-15 14:56:29
【问题描述】:

我正在使用带有视图寻呼机的选项卡布局并动态添加片段。现在我需要根据片段的滑动或标签的点击来更新出现在ViewPagers 片段中的TextView。假设如果我单击第一个选项卡或滑动我的片段,那么OperatorPlanList 片段中的TextView 会更新为“我只是单击”之类的文本。

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

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

那么如何根据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);
            }

        }

这就是我设置Tabs 的方式。

 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();

【问题讨论】:

  • 你的问题不清楚。

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


【解决方案1】:

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

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

在承载 ViewPager 的类中实现 ViewPager.OnPageChangeListener

在您的 ViewPagerFinder 中,在 instantiateItem() 期间保留 TabFragment 的列表(创建片段并将其转换为新接口,然后调用 super)。

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

现在您将在滑动期间获得对每个片段的回调,因此您可以检查其位置是否正确,如果页面正确,则执行您需要执行的任何操作。

有一些方法可以提高效率,但这只是让它发挥作用的快速方法。都是一样的

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多