【问题标题】:Passing a List From the MainActivity to a Fragment将列表从 MainActivity 传递到 Fragment
【发布时间】:2018-03-28 15:48:23
【问题描述】:

我有一个 viewPager 活动,它使用自定义 FragmentPagerAdapter 创建多个片段。

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

这是我的MainActivity 的一小部分,我在其中创建了fragments。我认为不需要 MainActivity 的其余代码来回答这个问题。

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

这是我的自定义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&lt;Audio&gt; 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;
}

将来我还需要得到tabtitle,但我猜我会得到它类似于audioList。如果不是,那么我还可以使用帮助来获取 tab 标题。

此外,如果代码样式有误,我也很乐意收到一些反馈。

【问题讨论】:

  • 你的清单可以打包吗?
  • @Chol 如果我理解 parcelable 正确,那么不,不是。该列表由音频对象组成,是一个 ArrayList。但我可能对 parcelable 的理解有误。
  • 音频对象只包含可打包的数据(String, int ...)?
  • @Chol 是的,Audio(String data, String title, String album, String artist)
  • 看卢克的回答

标签: android android-fragments android-viewpager fragmentpageradapter


【解决方案1】:

执行此操作的传统方法是使用一个实例方法,通过一个包来移动它。

像这样:

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),用于生成可快速轻松地生成可打包代码。

【讨论】:

  • 在您的适配器中调用片段:return BlankFragment.newInstance(tabTitles[position], audioList);
  • 所以我设法制作了音频列表parcelale 并添加了@LukeWaggoner 所说的内容,但我不知道在哪里将返回语句添加到适配器中。目前我得到的音频列表是空的。
  • 代替案例0:返回新的BlankFragment();
  • 不,正常应该没问题,newInstance方法是public static ...
  • @kataroty 去这里,我会帮你:chat.stackoverflow.com/rooms/info/167755/…
猜你喜欢
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
相关资源
最近更新 更多