【问题标题】:FragmentPagerAdapter passing list of object to fragment when data is ready当数据准备好时,FragmentPagerAdapter 将对象列表传递给片段
【发布时间】:2018-10-06 22:14:18
【问题描述】:

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

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

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

经过一些研究,从 Activity 向 Fragment 发送数据也可以使用接口来完成。但它变成了两者都在相互实施,我得到了

循环继承错误

互联网上讨论如何将数据从 Activity 传递到 Fragment 的大部分话题都是在创建 Fragment、使用 bundle 等时发生的。

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

当对服务器的请求完成时(之前已经创建的片段),是否有任何正确的方法如何将数据(在我的情况下是列表对象)从活动传递到片段?谢谢你。

这是我的一些代码

主活动

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

空白片段

public class BlankFragment extends Fragment {

private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;

private OnFragmentInteractionListener mListener;


private final Context context = getContext();
private SharedPreferences sharedPreferences;
private int mRole;


private ImageView ivNoData;
private ExpandableListView elvKegiatan;
private ListView lvKegiatan;

private EditText etFrom, etTo;
private String dateFrom, dateTo;

private List<Kegiatan> listKegiatan;
private List<Kegiatan> superKegiatanSaya;
private List<Kegiatan> superKegiatanAnak;



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

public static BlankFragment newInstance() { //String param1, String param2
    BlankFragment fragment = new BlankFragment();
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {

        sharedPreferences = context.getSharedPreferences(
                getResources().getString(R.string.myspkey), Context.MODE_PRIVATE);

        mRole = sharedPreferences.getInt(getString(R.string.splogin_role), 0);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_kegiatan, container, false);


    FloatingActionButton fabAddKeg = view.findViewById(R.id.fabAddKegiatan);
    fabAddKeg.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(context, TambahKegiatanActivity.class));
        }
    });


    lvKegiatan = view.findViewById(R.id.listViewKegiatan);
    elvKegiatan = view.findViewById(R.id.elvKegiatan);

    View buttonSearch = view.findViewById(R.id.buttonSearch);
    buttonSearch.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onButtonPressed();
        }
    });


    etFrom = view.findViewById(R.id.editTextFrom);
    etTo = view.findViewById(R.id.editTextTo);

    populateList();
    prepareDate();


    LinearLayout llRangeKeg = view.findViewById(R.id.linearLayoutRangeKeg);
    switch (mRole){
        case UserConst.ROLE_USER:
            break;
        case UserConst.ROLE_SUPER:
        case UserConst.ROLE_CEO:
        case UserConst.ROLE_CFO:
            llRangeKeg.setVisibility(View.GONE);
            break;
        case UserConst.ROLE_ADMIN:
        case UserConst.ROLE_FINANCE:
            llRangeKeg.setVisibility(View.GONE);
            fabAddKeg.setVisibility(View.GONE);
            break;
    }

    return view;

}


// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed() {
    if (mListener != null) {
        mListener.onFragmentInteraction();
    }
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}


/**
 * This interface must be implemented by activities that contain this
 * fragment to allow an interaction in this fragment to be communicated
 * to the activity and potentially other fragments contained in that
 * activity.
 * <p>
 * See the Android Training lesson <a href=
 * "http://developer.android.com/training/basics/fragments/communicating.html"
 * >Communicating with Other Fragments</a> for more information.
 */
public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction();

}

【问题讨论】:

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


    【解决方案1】:

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

    1. 为事件创建一个类(例如Data)

      公共类数据{ 公共列表对象; //获取器和设置器 }

    2. 在您的 Fragment 中放置一个订阅者。添加:

      @Subscribe(threadMode = ThreadMode.MAIN)
      公共无效onMessageEvent(数据数据){ //你可以通过data.getObjects()获取对象列表;
      };

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

      @覆盖 公共无效 onStart() { super.onStart(); EventBus.getDefault().register(this); }

      @覆盖 公共无效 onStop() { 超级.onStop(); EventBus.getDefault().unregister(this); }

    4. 在您的活动中发布数据准备好的事件

      数据数据 = 新数据(); 数据集对象(对象); EventBus.getDefault().post(data);

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

      实现'org.greenrobot:eventbus:3.1.1'

    更多信息here

    【讨论】:

      【解决方案2】:

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

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

      2 )制作接口对象

      DataUpdateListener dataListener;
      

      3 )在activity中添加注册方法:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-05
        • 2013-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多