将列表从MainActivity传递到片段

时间:2018-03-28 15:48:24

标签: android android-fragments android-viewpager fragmentpageradapter

我有一个viewPager活动,可以使用自定义FragmentPagerAdapter制作多个片段。

我需要获取List<Audio> audioList并在我的fragment中使用它。

以下是我MainActivity fragments的一小部分内容。 ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager(), MainActivity.this, audioList); viewPager.setAdapter(pagerAdapter); // Give the TabLayout the ViewPager TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); tabLayout.setupWithViewPager(viewPager); // Iterate over all tabs and set the custom view for (int i = 0; i < tabLayout.getTabCount(); i++) { TabLayout.Tab tab = tabLayout.getTabAt(i); tab.setCustomView(pagerAdapter.getTabView(i)); } 我认为不需要其余的MainActivity代码来回答这个问题。

FragmentPagerAdapter

这是我的自定义public class PagerAdapter extends FragmentPagerAdapter { String tabTitles[] = new String[] { "Recommended", "Popular", "Rock", "Pop", "Blues", "Chill" }; Context context; private List<Audio> audioList; public PagerAdapter(FragmentManager fm, Context context, List<Audio> audioList) { super(fm); this.context = context; this.audioList = audioList; } @Override public int getCount() { return tabTitles.length; } @Override public Fragment getItem(int position) { switch (position) { case 0: return new BlankFragment(); case 1: return new BlankFragment(); case 2: return new BlankFragment(); case 3: return new BlankFragment(); case 4: return new BlankFragment(); case 5: return new BlankFragment(); } return null; } @Override public CharSequence getPageTitle(int position) { // Generate title based on item position return tabTitles[position]; } public View getTabView(int position) { View tab = LayoutInflater.from(context).inflate(R.layout.custom_tab, null); TextView tv = (TextView) tab.findViewById(R.id.custom_text); tv.setText(tabTitles[position]); return tab; } }

List<Audio> audioList

我需要在这里将public class BlankFragment extends Fragment { public BlankFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.content_view, container, false); //Get auidoList here return rootView; } 放入我的片段中:

title

我还需要在将来获得tab的{​​{1}},但我的猜测是我会得到与audioList相似的内容。如果不是,那么我也可以使用帮助来获得tab标题。

此外,如果代码风格错误,那么我也很乐意收到一些反馈意见。

1 个答案:

答案 0 :(得分:2)

这样做的传统方法是使用一个实例方法,通过一个包来移动它。

像这样:

public class BlankFragment extends Fragment {

    public static BlankFragment newInstance(String title, ArrayList<Audio> audioList) {

        BlankFragment blankFragment = new BlankFragment();

        Bundle bundle = new Bundle();
        bundle.putString("Title", title);
        bundle.putParcelableArrayList("AudioList", audioList);

        blankFragment.setArguments(bundle);

        return blankFragment;
    }

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

    private String title;
    private ArrayList<Audio> audioList;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Bundle bundle = getArguments();
        if (bundle != null) {
            title = bundle.getString("Title");
            audioList = getArguments().getParcelableArrayList("AudioList");
        }
    }

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


        //Get auidoList here

        return rootView;
    }
}

显然,您的Audio课程需要实施parcelable才能实现此目的。我在Android Studio中找到了一个很棒的插件(Android Parcelable Code Generator),用于生成可快速简便的parcelable代码。