Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将ArrayList从自定义适配器传递到片段_Android_Android Fragments_Android Adapter - Fatal编程技术网

Android 如何将ArrayList从自定义适配器传递到片段

Android 如何将ArrayList从自定义适配器传递到片段,android,android-fragments,android-adapter,Android,Android Fragments,Android Adapter,我创建了一个片段,它依次加载两个带有单独片段(学生和问题)的选项卡。这两个片段是两个列表视图:一个带有学生姓名和复选框,另一个带有一些问题 我想知道从列表视图中检查哪些学生。使用自定义适配器中的ArrayList,我可以很容易地获得这一点。我打电话给“精选学生” 但是现在我想把ArrayList'selectedStudents'和选中的学生一起传递到主片段。但我做不到 这是我的代码: 主要类别: @Override protected void onCreate(Bundle save

我创建了一个片段,它依次加载两个带有单独片段(学生和问题)的选项卡。这两个片段是两个列表视图:一个带有学生姓名和复选框,另一个带有一些问题

我想知道从列表视图中检查哪些学生。使用自定义适配器中的ArrayList,我可以很容易地获得这一点。我打电话给“精选学生”

但是现在我想把ArrayList'selectedStudents'和选中的学生一起传递到主片段。但我做不到

这是我的代码:

主要类别:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                listaAlumnos = (ListView)findViewById(R.id.listViewAlumnosF);
        listaCuestiones = (ListView)findViewById(R.id.listViewCuestionesF);

//HERE I WANT TO READ THE ARRAYLIST WITH STUDENTS CHECKED

            }
        });
}


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

            return rootView;
        }
我的学生片段:

public class StudentsFragment extends Fragment {

ListView listStudentsF;
ArrayList<String> IdAlumnos = new ArrayList<String>();

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

View v = inflater.inflate(R.layout.fragment_alumnos, container, false);
        listStudentsF = (ListView)v.findViewById(R.id.listStudentsF);

perform();

}


public void perform() {
            myAdapterUsers myAdapterUsers = new myAdapterUsers(getActivity(), R.layout.list_item_alumnos, IdAlumnos);
            listStudentsF.setAdapter(myAdapterUsers);
    }
}
我已尝试在适配器中创建一个方法,如:

  public ArrayList<String> getArrayList() {
        return selectedStudents;
    }
public ArrayList getArrayList(){
返回所选学生;
}

并从外部活动调用,但不起作用。

让我们先说,片段之间的通信应该使用父活动、接口和一些粘合代码来完成。这已经被问了好几次了,而且也很有趣

尽管如此,在您的情况下,我要做的是将数据与视图分开

您选定的学生名单不应在活动或片段中存在或被修改

您的活动(及其片段)仅仅是Android框架提供的容器和策略委托(如果我可以使用谷歌的术语的话)。你不可能拥有一个没有它们的Android应用程序(至少是一个显示UI的应用程序),所以你必须拥有它们。但这并不意味着你所有的代码都应该在那里

远非如此。活动和片段本身是复杂的(它们有很多事情要做),因此

您的片段应该“请求其数据”来显示列表,并将更改推送到一个地方(我们称之为存储库),因此一旦用户点击列表中的“Alumno”,列表就会告诉repo:“嘿,这个Alumno被选中了”

存储库将接收这些信息,过滤结果并发布它们

在另一端,另一个片段(对所选校友感兴趣的片段)将侦听这些更改,并被告知显示什么

可以这样想:

FragmentOther启动并要求回购:“给我要显示的数据” 存储库将回复:这是校友名单

如果用户更改了选择(在学生片段中),它将执行之前所做的操作,告诉repo:嘿,又是被选择的学生,他们更改了

回购协议将再次过滤问题列表,并将其提供给感兴趣的任何人

如果FragmentOther(问题)打开,它将收到它,如果没有,一旦打开,它将请求当前列表,然后回购将返回它

所以你看,这一切的关键是臭名昭著的关注点分离

每个类/对象必须具有最少的职责,并且尽可能可重用

为了使用现代Android实践实现所有这些,我建议您花时间学习:

例如,LiveData、存储库模式和生命周期


所有这些都是我们工作的一部分

让我们首先说,片段之间的通信应该使用父活动、接口和一些粘合代码来完成。这已经被问了好几次了,而且也很有趣

尽管如此,在您的情况下,我要做的是将数据与视图分开

您选定的学生名单不应在活动或片段中存在或被修改

您的活动(及其片段)仅仅是Android框架提供的容器和策略委托(如果我可以使用谷歌的术语的话)。你不可能拥有一个没有它们的Android应用程序(至少是一个显示UI的应用程序),所以你必须拥有它们。但这并不意味着你所有的代码都应该在那里

远非如此。活动和片段本身是复杂的(它们有很多事情要做),因此

您的片段应该“请求其数据”来显示列表,并将更改推送到一个地方(我们称之为存储库),因此一旦用户点击列表中的“Alumno”,列表就会告诉repo:“嘿,这个Alumno被选中了”

存储库将接收这些信息,过滤结果并发布它们

在另一端,另一个片段(对所选校友感兴趣的片段)将侦听这些更改,并被告知显示什么

可以这样想:

FragmentOther启动并要求回购:“给我要显示的数据” 存储库将回复:这是校友名单

如果用户更改了选择(在学生片段中),它将执行之前所做的操作,告诉repo:嘿,又是被选择的学生,他们更改了

回购协议将再次过滤问题列表,并将其提供给感兴趣的任何人

如果FragmentOther(问题)打开,它将收到它,如果没有,一旦打开,它将请求当前列表,然后回购将返回它

所以你看,这一切的关键是臭名昭著的关注点分离

每个类/对象必须具有最少的职责,并且尽可能可重用

为了使用现代Android实践实现所有这些,我建议您花时间学习:

例如,LiveData、存储库模式和生命周期


所有这些都是我们工作的一部分

非常感谢你的回答。读了你的评论,我意识到我还有很多东西要学编程。我会听从你的建议。谢谢,非常感谢你的回答。读了你的评论,我意识到我还有很多东西要学编程。我会听从你的建议。非常感谢。
  public ArrayList<String> getArrayList() {
        return selectedStudents;
    }