如何在ViewPager中刷新Fragment

4
我有一个名为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);

    }

1
可能是重复的问题: https://dev59.com/UGIj5IYBdhLWcg3wCg_X - Mustansir
你想要实现什么?你的代码想要做的是 - 启动 HomeTabs 片段,加载 HomeTabs 片段内部的 ViewPager。然后在 C 标签的 onRefresh() 方法中,你的代码试图用新的 HomeTabs 片段实例替换当前的 HomeTabs 片段。你确定这就是你想要的吗? - zeekhuge
我的结构是在选项卡C上触发onRefresh,它将向HomeTabs发送数据,当我重新加载HomeTabs时,它将显示选项卡C而不是选项卡A。 - Morton
每次重新启动活动以刷新数据都是一个非常糟糕的想法。为什么不可以在选项卡 C 中刷新视图?我猜这就是您想显示动态数据/进度的地方。尝试设置新数据,然后使用 <要刷新的视图>.invalidate() 来刷新视图。 - zeekhuge
你也可以尝试重新加载你的“适配器”:adapter.notifyDataSetChanged(); - Mustansir
显示剩余8条评论
3个回答

4

有许多方法可以做到这一点。 如果您使用 ViewPager,最好的解决方案在这里找到。

您必须在您的页面适配器中实现(覆盖)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视图消失了。 - Morton

1

将标签设置为“fragment”以指定您的片段。

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

感谢您的回复,我尝试了您的代码,但是当我刷新时,我的选项卡 C 视图仍然消失。 - Morton
你只是想刷新选项卡 C 或其他选项卡中的更改吗? - Surendra Shrestha
我只想刷新选项卡C。 - Morton
首先执行以下操作: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"); } - Surendra Shrestha
如果您有任何数据更改,请确保将其编写在OnViewCreated下。 - Surendra Shrestha
你回复的代码是什么意思?我确定它在OnViewCreated下面,因为当项目第一次启动时,我可以看到视图。 - Morton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接