【问题标题】:How do i refresh fragment in ViewPager如何在 ViewPager 中刷新片段
【发布时间】:2017-06-28 07:40:17
【问题描述】:

我有一个MainActivity 和一个HomeTabs,带有三个标签(A B C),它们都是Fragment。我在选项卡 C 上设置了 onRefresh。当我触发 onRefresh 时,它的视图消失了。这是为什么?我解决不了。

任何帮助将不胜感激。提前致谢。

这是我的HomeTabs

public class HomeTabs extends Fragment {
    private Context context;
    private TabLayout tabLayout;

    private int[] imageResId = {R.drawable.input_icon_color,
            R.drawable.note_icon_color,
            R.drawable.analytics_icon_color};

    public HomeTabs() {
        // Required empty public constructor
    }

    public static HomeTabs newInstance() {
        return new HomeTabs();
    }

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

        tabLayout = (TabLayout) view.findViewById(R.id.tabLayout);
        tabLayout.addTab(tabLayout.newTab().setText(getResources().getString(R.string.tab1)));
        tabLayout.addTab(tabLayout.newTab().setText(getResources().getString(R.string.tab2)));
        tabLayout.addTab(tabLayout.newTab().setText(getResources().getString(R.string.tab3)));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

        final ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewPagerDataReport);

        ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(viewPagerAdapter);

        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

        tabLayout.getTabAt(0).setIcon(R.drawable.input_icon);
        tabLayout.getTabAt(1).setIcon(imageResId[1]);
        tabLayout.getTabAt(2).setIcon(imageResId[2]);

        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());/

                int id = tab.getPosition();
                if (id == 0) {
                    tabLayout.getTabAt(0).setIcon(R.drawable.input_icon);
                    tabLayout.getTabAt(1).setIcon(imageResId[1]);
                    tabLayout.getTabAt(2).setIcon(imageResId[2]);
                }

                if (id == 1) {
                    tabLayout.getTabAt(0).setIcon(imageResId[0]);
                    tabLayout.getTabAt(1).setIcon(R.drawable.note_icon);
                    tabLayout.getTabAt(2).setIcon(imageResId[2]);
                }

                if (id == 2) {
                    tabLayout.getTabAt(0).setIcon(imageResId[0]);
                    tabLayout.getTabAt(1).setIcon(imageResId[1]);
                    tabLayout.getTabAt(2).setIcon(R.drawable.analytics_icon);
                }
            }

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

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

        // My tab C position is 2 , when i refresh that i want to show tab C
        if (getActivity().getIntent().hasExtra("refresh")){
            tabLayout.getTabAt(2).select();
        }

        return view;
    }
}

这是我的标签 C Fragment 关于刷新:

@Override
public void onRefresh() {
    refreshLayout.setRefreshing(false);

    MainActivity mainActivity = (MainActivity) getActivity();
    mainActivity.refreshFragment();
}

还有MainActivity

public class MainActivity extends AppCompatActivity {

    private FrameLayout frameLayout;
    private Toolbar toolBar;

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

        toolBar = (Toolbar) findViewById(R.id.toolBar);
        setSupportActionBar(toolBar);
        getSupportActionBar().setTitle("");
        toolBar.setTitle(R.string.myAppName);
        toolBar.setNavigationIcon(R.drawable.medical_history32);
        toolBar.setTitleTextColor(Color.WHITE);

        frameLayout = (FrameLayout) findViewById(R.id.frameLayout);

        if (savedInstanceState == null) {
            switchFragment(HomeTabs.newInstance());
        }


    }

    public void switchFragment(Fragment fragment) {
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.frameLayout, fragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }



    public void setTitle(String title) {
        getSupportActionBar().setTitle(title);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            new DialogHandler(this).quickDialog(
                    getResources().getString(R.string.quick),
                    getResources().getString(R.string.confirm),
                    getResources().getString(R.string.cancel),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                            finish();
                        }
                    }, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    });
        }
        return super.onKeyDown(keyCode, event);
    }


    public void refreshFragment() {
        //switchFragment(HomeTabs.newInstance());
        Intent intent = new Intent(this,MainActivity.class);
        intent.putExtra("refresh",true);
        startActivity(intent);
    }

}

这是我的标签 C:

public class MyLineChart extends Fragment implements SwipeRefreshLayout.OnRefreshListener{
    private View view;
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_my_line_chart, container, false);

        //................set my data

        return view;
    }

    @Override
    public void onRefresh() {
        refreshLayout.setRefreshing(false);

    }

【问题讨论】:

  • 感谢分享链接,我试过了,好像可以刷新了,但是刷新后我的tab C视图还是不见了。
  • 你想达到什么目的?您的代码试图做的是 - 启动 HomeTabs 片段,在 HomeTabs 片段中加载 ViewPager。然后在 C 选项卡的onRefresh() 中,您的代码试图用HomeTabs 片段的新实例替换当前的HomeTabs 片段。你确定这就是你想要的?
  • 我的结构是选项卡 C 上的触发器 onRefresh,它将数据发送到 HomeTabs,当我重新加载 HomeTabs 时,它将显示选项卡 C 而不是选项卡 A。
  • 每次都重新启动 Activity 以刷新数据是一个非常糟糕的主意。为什么你可以在 Tab C 中刷新你的视图?我猜这就是您要显示动态数据/进度的地方。尝试设置新数据,然后刷新视图使用<view to refresh>.invalidate()

标签: android android-fragments android-tablayout


【解决方案1】:

有很多方法可以做到这一点。 如果您使用的是ViewPager,则可以找到最佳解决方案here

您必须在页面适配器中实现(覆盖)getItemPosition 方法才能返回(不更改位置)

 @Override
 public int getItemPosition(Object object) {
     return POSITION_NONE;
 }

然后要从任何地方更新,您只需通知适配器发生更改

mPagerAdapter.notifyDataSetChanged();

【讨论】:

    【解决方案2】:

    您的以下代码用于重新加载您的片段:

     FragmentTransaction ft = getFragmentManager().beginTransaction();                                   
    
     ft.detach(YourFragmentName.this).attach(YourFragmentName.this).commit();
    

    【讨论】:

    • 谢谢,它可以刷新,但我的问题仍然存在,当我刷新时选项卡 C 视图消失了。
    【解决方案3】:

    首先将您的片段标记为“片段”

     @Override
    public void onRefresh() 
    {
        Fragment currentFragment = getFragmentManager().findFragmentByTag("FRAGMENT");
        FragmentTransaction fragTransaction = getFragmentManager().beginTransaction();
        fragTransaction.detach(currentFragment);
        fragTransaction.attach(currentFragment);
        fragTransaction.commit();
    }
    

    【讨论】:

    • 感谢您的回复,我试试您的代码,刷新时我的标签 C 视图消失了。
    • 您只是想刷新选项卡C或其他选项卡中的其他更改?
    • 我只想刷新标签C。
    • 先做` if (id == 2) { tabLayout.getTabAt(0).setIcon(imageResId[0]); tabLayout.getTabAt(1).setIcon(imageResId[1]); tabLayout.getTabAt(2).setIcon(R.drawable.analytics_icon); //设置标签为tabLayout.getTabAt(2).setTag("FRAGMENT"); }`
    • 如果您有任何数据更改,请确保将其写入 OnViewCreated 下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多