【问题标题】:Pass Arraylist from fragment to its own Activity将 Arraylist 从 Fragment 传递给它自己的 Activity
【发布时间】:2014-11-18 01:59:21
【问题描述】:

我有一个构建歌曲 ArrayList 的片段,我想将该 ArrayList 传递给片段的活动。我知道我可以使用界面,但不知道我该怎么做

public class SongsListFragment extends Fragment
{

    public interface passArrayList {
            public void onArticleSelected(Uri articleUri);    
            // from android guide i don't know what to do
    }


}

这是我目前所拥有的,请告诉我为什么我得到 NullPointer

在 MainActivity 上

    @Override
    public void onFragmentSetSongs(ArrayList<Song> songs){
        songsArrayList = songs;
    }

    @Override
    public void onSongListItemClick(int position) {
        musicService.setSong(position);
        Song playSong = songsArrayList.get(position);
        txtCurrentSongTitle.setText(playSong.getTitle());
        txtCurrentSongTitle.requestFocus();
        musicService.playSong(); 

        btnPlayPause.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_pause));

        if (playbackPaused) {
            playbackPaused = false;
        }

        //setDownloaded();

    }

关于片段

OnFragmentInteractionListener  songsCallBack;
OnFragmentInteractionListener  songsItemClick;

public interface OnFragmentInteractionListener {
    public void onFragmentSetSongs(ArrayList<Song> s);
    public void onSongListItemClick(int position);

}

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

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
        songsCallBack = (OnFragmentInteractionListener) getActivity();
        songsItemClick = (OnFragmentInteractionListener) getActivity();
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnHeadlineSelectedListener");
    }
}

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

listView = (ListView) root.findViewById(R.id.listViewSongs);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                songsItemClick.onSongListItemClick(position);
            }
        });

关于我完成构建 songArrayList 的方法,我做到了

songsCallBack.onFragmentSetSongs(songArrayList);

点击 ListView 时出错

at com..activities.MainActivity.onSongListItemClick(MainActivity.java:107)
            at com..fragments.SongsListFragment$1.onItemClick(SongsListFragment.java:194)
            at android.widget.AdapterView.performItemClick(AdapterView.java:308)
            at android.widget.AbsListView.performItemClick(AbsListView.java:1478)
            at android.widget.AbsListView$PerformClick.run(AbsListView.java:3480)

错误位置

 musicService.setSong(position);       //Main Activity (MainActivity.java:107)

 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            songsItemClick.onSongListItemClick(position);  < --  here
 }

【问题讨论】:

    标签: java android listview android-fragments arraylist


    【解决方案1】:

    更改界面名称,使其以大写字母开头。然后在您的活动中将此行添加到您的活动声明中:public class FragmentActivity extends Activity implements PassArrayList,覆盖接口方法。并在片段中添加以下内容:

    PassArrayList mCallback;
    
    
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mCallback = (PassArrayList) getActivity();
    }
    
    @Override
    public void onDetach() {
        super.onDetach();
        mCallback = null;
    }
    

    在代码中的某处,当您想将歌曲列表传递回活动时,调用 mCallback 对象上的方法 onArticleSelected() 并将您的数组列表传递给此方法。然后这个数组列表将作为你活动中方法onArticleSelected() 的参数,你可以用它做任何你喜欢的事情。但是不要忘记在onDetach()钩子方法中取消指向mCallback的链接以防止上下文泄漏

    【讨论】:

    • 回调似乎一切正常。你检查你的服务是否不为空?
    • 哦,这就是原因,我实际上并没有连接到服务。当我在 onCreate 上连接到服务时,它现在已修复。
    • 我有一个后续问题,因为你擅长这些东西,好的,当我的应用程序启动并加载片段时,它会正确传递到数组列表中。现在,当我点击导航按钮进行替换时当前片段与另一个片段...该片段与第一个片段完全相同,但具有不同的数组列表...我如何将数组列表更新为活动
    • 我制作的秒片段和第一个完全一样。但是我得到了我在 onattach 上定义的类转换异常
    • 如果我理解正确,那么在你的第二个片段中你必须声明第二个回调,并在你的第二个片段而不是第一个片段的接口中使用它。此外,您必须向您的活动添加另一个实现声明,并且在您的第二个片段中,您必须将 getActivity 转换为第二个接口
    猜你喜欢
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多