安卓ViewPager如何刷新Fragment

6

我的应用有两个选项卡(Android Design Support Library),这是使用ViewPagerAdapter的片段:

public class ListaCanali extends Fragment {

public static TabLayout tabLayout;
public static ViewPager viewPager;
public static int int_items = 2 ;

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

    //Titolo Fragment
    ((MainActivity) getActivity()).setActionBarTitle("Lista Canali");

    //FindViewById
    tabLayout = (TabLayout) v.findViewById(R.id.tabs);
    viewPager = (ViewPager) v.findViewById(R.id.viewpager);

    //Funzioni Tab
    viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
    tabLayout.post(new Runnable() {
        @Override
        public void run() {
            tabLayout.setupWithViewPager(viewPager);
        }
    });

    return v;
}


//Adattatore Tab
class MyAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int position)
    {
        switch (position){
            case 0 : return new FragmentCanali();
            case 1 : return new FragmentPreferiti();
        }
        return null;
    }

    public int getCount() {

        return int_items;

    }

    public CharSequence getPageTitle(int position) {

        switch (position){
            case 0 :
                return "Tutti";
            case 1 :
                return "Preferiti";
        }
        return null;
    }

我希望我的应用在滑动和点击选项卡标题时可以刷新片段,因为这目前无法实现。希望你们能帮助我。


请查看此示例:https://github.com/CabezasGonzalezJavier/RefreshCurrentFragmentWithinViewPager - Cabezas
感谢使用 getChildFragmentManager()。我在我的项目中将 getFragmentManager() 替换为了它。 - CoolMind
2个回答

7

我相信这不是唯一/最好的方法。但是它可以像解决我的问题一样解决问题。

请在FragmentCanali和FragmentPreferiti片段中编写refresh()方法。

    public class ListCanali extends Fragment implements OnPageChangeListener{
    private MyAdapter mAdapter;

    @Override
    public View OnCreateView (...) {
    ...
    if(mAdapter == null) {
    mAdapter = new MyAdapter(getChildFragmentManager());
    }
    viewPager.setAdapter(mAdapter);
    viewPager.setOnPageChangeListener(this);
    ...
    }

    ...
    @Override
    public void OnPageSelected (int position) {
    switch (position){
            case 0 : ((FragmentCanali)adapter.getItem(position)).refresh();
            case 1 : ((FragmentPreferiti)adapter.getItem(position)).refresh();
        }
    }}

如果你从具有抽象refresh()方法的基本fragment扩展两个片段,代码会更加简洁。

在onPageSelected()中,您只需调用((BaseFragment)adapter.getItem(position)).refresh()即可。


6
尝试一下这个...
要刷新一个片段,需要先获取它的实例。
修改这个。
 viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));

to

 ArrayList<Fragment> fr_list = new ArrayList<Fragment>();
 fr_list.add(new FragmentCanali());
 fr_list.add(new FragmentPreferiti());
 MyAdapter mMyAdapter = new MyAdapter(getChildFragmentManager(),fr_list);
 viewPager.setAdapter(mMyAdapter);

将适配器中的此处更改。
 public MyAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position)
{
    switch (position){
        case 0 : return new FragmentCanali();
        case 1 : return new FragmentPreferiti();
    }
    return null;
}

public int getCount() {

    return int_items;

}

to

 public MyAdapter(FragmentManager fm,ArrayList<Fragment> fr_list) {
    super(fm);
    this.fr_list=fr_list;
}

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

public int getCount() {

    return fr_list.size();

}

在片段中添加refresh()方法,需要时调用它,如下所示。
((FragmentCanali) mMyAdapter.fr_list.get(0)).refresh();

你好,谢谢,但请给我看一下错误...屏幕截图:点击这里 - Simone Varletta
好的,我解决了,但是出现了新错误:点击这里 - Simone Varletta
请在您的适配器中添加以下代码:ArrayList<Fragment> fr_list; - uday
我已经添加了这行代码,请看屏幕上的内容。fr_list是什么?你能编辑并将我的片段放入示例中吗? - Simone Varletta
1
((FragmentCanali)fr_list.get(0)).refresh(); 更改为 ((FragmentCanali)mMyAdapter.fr_list.get(0)).refresh();,其中 mMyAdapter 是您的适配器成员变量。 - lenooh

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