Android 将数据从一个片段发送到另一个片段

Android 将数据从一个片段发送到另一个片段,android,fragment,Android,Fragment,我是Android编程的初学者,目前正在练习片段。我有3个片段,我想把一些数据从一个发送到另一个。在ArtistFragment中,我有一个艺术家列表,当用户单击某个艺术家时,我希望我的应用程序自动滑动到AlbumsFragment并仅显示以前选定艺术家的专辑。因此,它应该将相册列表发送到相册片段。这是我的片段和适配器。请帮忙 public class ArtistsFragment extends Fragment { private ArrayList<Artist> arti

我是Android编程的初学者,目前正在练习片段。我有3个片段,我想把一些数据从一个发送到另一个。在ArtistFragment中,我有一个艺术家列表,当用户单击某个艺术家时,我希望我的应用程序自动滑动到AlbumsFragment并仅显示以前选定艺术家的专辑。因此,它应该将相册列表发送到相册片段。这是我的片段和适配器。请帮忙

public class ArtistsFragment extends Fragment {

private ArrayList<Artist> artistList = new ArrayList<Artist>();
private  ArrayList<Album> albumList = new ArrayList<Album>();
private ArrayList<Song> songList = new ArrayList<Song>();

private ListView artistView;
private View rootView;

@Override
public View onCreateView(LayoutInflater inflater,
        @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    rootView = inflater.inflate(R.layout.artists_fragment, container, false);

    showArtists();
    selectArtist();
    return rootView;
}

public void showArtists() {
    // TODO Auto-generated method stub
    artistList = (ArrayList<Artist>) getArguments().getSerializable("key");
    artistView = (ListView) rootView.findViewById(R.id.artistList);
    ArtistAdapter artistAdapter = new ArtistAdapter(getActivity(), R.layout.artists_item, artistList);
    artistView.setAdapter(artistAdapter);
}

public void selectArtist(){
    artistView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View arg1, int position,
                long arg3) {

            Artist artist = (Artist) artistView.getAdapter().getItem(position);
            albumList = artist.getAlbumList();
            Bundle bundle = new Bundle();
            bundle.putSerializable("key", albumList);

            getActivity().getActionBar().setSelectedNavigationItem(1);

        }
    });
}
公共类ArtistsFragment扩展片段{
私有ArrayList artistList=新ArrayList();
private ArrayList albumList=新建ArrayList();
private ArrayList songList=new ArrayList();
私有列表视图artistView;
私有视图rootView;
@凌驾
创建视图上的公共视图(更平坦的充气机,
@可为空的视图组容器,@Nullable Bundle savedInstanceState){
//TODO自动生成的方法存根
rootView=充气机。充气(R.layout.u碎片,容器,假);
表演艺术家();
选择艺术家();
返回rootView;
}
公众艺术工作者(){
//TODO自动生成的方法存根
artistList=(ArrayList)getArguments().getSerializable(“键”);
artistView=(ListView)rootView.findViewById(R.id.artistList);
ArtistAdapter ArtistAdapter=新的ArtistAdapter(getActivity(),R.layout.artists_项,artistList);
artistView.setAdapter(artistAdapter);
}
公共空间艺术家(){
artistView.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父视图、视图arg1、整型位置、,
长arg3){
艺术家=(艺术家)artistView.getAdapter().getItem(位置);
albumList=artist.getAlbumList();
Bundle=新Bundle();
bundle.putSerializable(“key”,相册列表);
getActivity().getActionBar().setSelectedNavigationItem(1);
}
});
}
}

公共类AlbumsFragment扩展了片段{
公众观点;
私有列表视图;
private ArrayList albumList=新建ArrayList();
@凌驾
创建视图上的公共视图(更平坦的充气机,
@可为空的视图组容器,@Nullable Bundle savedInstanceState){
//TODO自动生成的方法存根
rootView=充气机。充气(R.layout.albums\u片段,容器,false);
showAlbums();
选择相册();
返回rootView;
}
私人void showAlbums(){
albumList=(ArrayList)getArguments().getSerializable(“键”);
albumView=(ListView)rootView.findViewById(R.id.albumList);
AlbumAdapter AlbumAdapter=新的AlbumAdapter(getActivity(),R.layout.album_项,albumList);
设置适配器(albumAdapter);
}
public void selectAlbum(){
albumView.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共链接(AdapterView arg0、视图arg1、内部arg2、,
长arg3){
//TODO自动生成的方法存根
getActivity().getActionBar().setSelectedNavigationItem(2);
}
});
}
}

最后是我的TabsPagerAdapter

public class TabsPagerAdapter extends FragmentPagerAdapter {

private ArrayList<Artist> artistList = new ArrayList<Artist>();
private ArrayList<Album> albumList = new ArrayList<Album>();
private ArrayList<Song> songList = new ArrayList<Song>();

public TabsPagerAdapter(FragmentManager fm, ArrayList<Artist> artistList, ArrayList<Album> albumList, ArrayList<Song> songList) {
    super(fm);
    setArtistList(artistList);
    setAlbumList(albumList);
    setSongList(songList);

    // TODO Auto-generated constructor stub
}

@Override
public Fragment getItem(int index) {
    // TODO Auto-generated method stub
    switch(index){
    case 0:
        ArtistsFragment artistFragment = new ArtistsFragment();
        Bundle artistBundle = new Bundle();
        artistBundle.putSerializable("key", artistList);
        artistFragment.setArguments(artistBundle);
        return artistFragment;
    case 1:
        AlbumsFragment albumsFragment = new AlbumsFragment();
        Bundle albumBundle = new Bundle();
        albumBundle.putSerializable("key", albumList);
        albumsFragment.setArguments(albumBundle);
        return albumsFragment;
    case 2:
        SongsFragment songsFragment = new SongsFragment();
        Bundle songBundle = new Bundle();
        songBundle.putSerializable("key", songList);
        songsFragment.setArguments(songBundle);
        return songsFragment;
    }
    return null;
}
公共类选项卡SpagerAdapter扩展了FragmentPagerAdapter{
私有ArrayList artistList=新ArrayList();
private ArrayList albumList=新建ArrayList();
private ArrayList songList=new ArrayList();
公共选项卡SpagerAdapter(FragmentManager fm、ArrayList艺人、ArrayList专辑列表、ArrayList歌曲列表){
超级(fm);
设置艺术家列表(艺术家列表);
设置相册列表(相册列表);
setSongList(歌曲列表);
//TODO自动生成的构造函数存根
}
@凌驾
公共片段getItem(int索引){
//TODO自动生成的方法存根
开关(索引){
案例0:
ArtistsFragment artistFragment=新ArtistsFragment();
Bundle artistBundle=新Bundle();
artistBundle.putSerializable(“键”,artistList);
artistFragment.setArguments(artistBundle);
返回艺术家片段;
案例1:
AlbumsFragment AlbumsFragment=新AlbumsFragment();
Bundle albundle=新Bundle();
albumBundle.putSerializable(“键”,albumList);
albumsFragment.setArguments(albumBundle);
返回相册碎片;
案例2:
SongsFragment SongsFragment=新歌曲片段();
Bundle songBundle=新Bundle();
songBundle.putSerializable(“key”,歌曲列表);
songsFragment.setArguments(songBundle);
返回歌曲片段;
}
返回null;
}

片段无法直接通信。这在整个活动中都会发生。两个片段不应直接通信。请看以下内容:

我更喜欢另一种方式,即使用otto之类的事件总线:


使用otto,您可以从一个片段发布事件,并从另一个片段订阅该事件。

尝试从一个片段直接通信到另一个片段不是一个好主意

最好的方法是在活动中提供一个回调接口,该接口将在活动中实现,或者在您的情况下,可以在FragmentPagerAdapter中实现 看看[http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity][1]

在回调方法中,您可以传递任何想要的参数,然后启动另一个片段

public class TabsPagerAdapter extends FragmentPagerAdapter {

private ArrayList<Artist> artistList = new ArrayList<Artist>();
private ArrayList<Album> albumList = new ArrayList<Album>();
private ArrayList<Song> songList = new ArrayList<Song>();

public TabsPagerAdapter(FragmentManager fm, ArrayList<Artist> artistList, ArrayList<Album> albumList, ArrayList<Song> songList) {
    super(fm);
    setArtistList(artistList);
    setAlbumList(albumList);
    setSongList(songList);

    // TODO Auto-generated constructor stub
}

@Override
public Fragment getItem(int index) {
    // TODO Auto-generated method stub
    switch(index){
    case 0:
        ArtistsFragment artistFragment = new ArtistsFragment();
        Bundle artistBundle = new Bundle();
        artistBundle.putSerializable("key", artistList);
        artistFragment.setArguments(artistBundle);
        return artistFragment;
    case 1:
        AlbumsFragment albumsFragment = new AlbumsFragment();
        Bundle albumBundle = new Bundle();
        albumBundle.putSerializable("key", albumList);
        albumsFragment.setArguments(albumBundle);
        return albumsFragment;
    case 2:
        SongsFragment songsFragment = new SongsFragment();
        Bundle songBundle = new Bundle();
        songBundle.putSerializable("key", songList);
        songsFragment.setArguments(songBundle);
        return songsFragment;
    }
    return null;
}