【问题标题】:Android ViewPager Refresh fragmentAndroid ViewPager 刷新片段
【发布时间】:2016-11-16 14:19:24
【问题描述】:

在我的应用中有 2 个选项卡(Android 设计支持库),这是带有 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;
    }

我希望我的应用在 Swipe 和单击标签标题时刷新片段,因为这不会发生,我希望你们能帮助我。

【问题讨论】:

  • 可以查看this example
  • 感谢getChildFragmentManager()。我在我的项目中用它替换了getFragmentManager()

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


【解决方案1】:

我确信这不是唯一/最好的方法。但这应该像对我一样解决问题。

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

    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() 方法的基本片段扩展这两个片段会更干净。

在 onPageSelected() 中你可以调用((BaseFragment)adapter.getItem(position)).refresh()

【讨论】:

    【解决方案2】:

    试试这个...

    要刷新片段,您首先需要它的实例。

    改一下

     viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
    

     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;
    
    }
    

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

    【讨论】:

    • 你好,谢谢,但显示错误...屏幕:Click HERE
    • 好的,我解决了,但我有新错误:CLICK HERE
    • 将此行添加到您的适配器 ArrayList fr_list;
    • 我已经添加了行看屏幕。 fr_list 是什么?您可以编辑我的片段并将其放入示例中吗?
    • ((FragmentCanali)fr_list.get(0)).refresh(); 更改为((FragmentCanali)mMyAdapter.fr_list.get(0)).refresh();,其中mMyAdapter 是适配器的成员变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多