FragmentPagerAdapter在数据准备好时将对象列表传递给片段

时间:2018-04-26 09:12:33

标签: android android-fragments android-activity android-viewpager fragmentpageradapter

我使用 FragmentPagerAdapter 创建了应用程序,其中包含3个片段内部静态类,让我们说MainActivity。基本上android工作室模板的选项卡式活动生成代码的方式,例如在android文档中也使用那个内部静态类 creating swipe view

但它对性能不利,因为我必须使所有变量和函数变为静态以使其工作,这也不是正确的事情。

所以我尝试将Fragment拆分为自己的类,并从本文开始 communicate between fragment 它告诉我们如何从片段到父活动发送变量/动作回调(在我的例子中是MainActivity)

经过一些研究,将活动数据发送到片段也可以使用接口完成。但它变成了两个人互相实现,我得到了

  

循环继承错误

互联网上讨论如何将数据从活动传递到片段的大部分主题都是在创建片段时使用bundle等发生的。

对于向服务器请求数据的动态应用程序,似乎无法使用。

在服务器请求完成的时候(片段之前已经创建过),有没有正确的方法如何将数据(在我的情况下是List Object)从活动传递到片段?谢谢您。

以下是我的一些代码

MainActivity

and

BlankFragment

    public class MainActivity extends AppCompatActivity implements BlankFragment.OnFragmentInteractionListener {

    //On create
    ViewPager viewPager = findViewById(R.id.vpPager);
    MyPagerAdapter adapterViewPager = new MyPagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(adapterViewPager);


    //adapter
    public static class MyPagerAdapter extends FragmentPagerAdapter {
    private static int NUM_ITEMS = 3;
    private String tabTitles[] = new String[]{"Home", "History", "My Account"}; 

    public MyPagerAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
    }

    // Returns total number of pages
    @Override
    public int getCount() {
        return NUM_ITEMS;
    }

    // Returns the fragment to display for that page
    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return BlankFragment.newInstance();
            case 1:
                return FragmentHistory.newInstance();
            case 2:
                return FragmentAccount.newInstance();
            default:
                return BlankFragment.newInstance();
        }
    }

    // Returns the page title for the top indicator
    @Override
    public CharSequence getPageTitle(int position) {
        return tabTitles[position];
    }

}
 @Override
public void onFragmentInteraction() {
    getKegiatan();
}
}

2 个答案:

答案 0 :(得分:0)

1)定义一个监听器接口。我通常将此作为活动中的内部接口:

 public interface DataUpdateListener {
        void onDataUpdate(List<Object> mData);
    }

2)制作界面对象

DataUpdateListener dataListener;

3)将注册方法添加到活动中:

public void registerDataUpdateListener(DataUpdateListener listener) {
     dataListener=listener;
}

4)让你的片段实现DataUpdateListener:

 public class MyFragment extends Fragment implements DataUpdateListener {

5)实施方法

 @Override
    public void onDataUpdate(List<Object> mData) {
        // put your UI update logic here
    }

6)覆盖片段中的onAttach()和onDestroy()以注册/取消注册:

 @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        ((MainActivity) activity).registerDataUpdateListener(this);
    }

7)在Fragment中更新UI时

dataListener.onDataUpdate(mData);

答案 1 :(得分:0)

我认为你可以在这种情况下使用EventBus

  1. 为事件创建一个类(例如,对于例如数据)

    公共类数据{     public List对象;     // getter&amp;二传手 }

  2. 在你的片段中放一个订阅者。添加:

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(Data data){     //你可以通过data.getObjects()得到对象列表;
    };

  3. 注册和取消注册您的订阅者(在片段中)

    @覆盖  public void onStart(){      super.onStart();      。EventBus.getDefault()寄存器(本);  }

    @覆盖  public void onStop(){      super.onStop();      。EventBus.getDefault()取消注册(这);  }

  4. 在您的活动中,在数据准备就绪时发布事件

    数据数据=新数据(); data.setObject(对象); EventBus.getDefault()后(数据);

  5. 不要忘记添加成绩依赖项:

    实施&#39; org.greenrobot:eventbus:3.1.1&#39;

  6. 更多信息here