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

时间:2019-07-01 16:28:58

标签: android android-fragments android-adapter

我创建了一个片段,该片段又加载了两个带有单独片段(学生和问题)的选项卡。这两个片段是两个ListView:一个带有学生的姓名和一个复选框,另一个带有一些问题。

我想要知道的是ListView中哪些学生被选中。使用自定义适配器中的ArrayList可以轻松实现这一点。我叫“ selectedStudents”。

但是现在我想将ArrayList'selectedStudents'与学生检查一起传递到主片段。但是我做不到。

这是我的代码:

MainClass:

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

还有我的自定义适配器(方法getView):

@Override
    public View getView(final int position, View convertView, ViewGroup viewGroup) {

View v = convertView;

 LayoutInflater layoutInflater = LayoutInflater.from(this.contextM);
        v = layoutInflater.inflate(R.layout.list_item_alumnos, null);

final String currentIdAlumnos = IdAlumnos.get(position);

final CheckBox checkBox = v.findViewById(R.id.checkBox2);

checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {

                //Comprueba si está checkeado el registro y lo añade o quita a un ArrayList de usuarios seleccionados.
                if (isChecked){
                    selectedStudents.add(currentIdAlumnos);
                }else {
                    selectedStudents.remove(currentIdAlumnos);
                }

                Log.e("SELEC: ", String.valueOf(selectedStudents));

            }
        });

return v;
}

我尝试在适配器中创建一个方法,例如:

  public ArrayList<String> getArrayList() {
        return selectedStudents;
    }

从外部Activity调用,但不起作用。

1 个答案:

答案 0 :(得分:1)

让我们开始说,片段之间的通信应该使用父活动,接口和一些粘合代码来完成。这个问题已被问过多次,而且也是A google documentation section

话虽如此,您要做的就是将数据与视图分开。

您选择的学生名单,不应存在于活动片段中或对其进行修改。

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

远离它。活动和片段本身很复杂(它们有很多事情要做),所以...

您的Fragment应该“询问其数据”以显示列表,并将更改推送到某个位置(我们将其称为存储库),因此一旦用户从列表中点击“ Alumno”,列表便会通知存储库: “嘿,这个校友被选中了”。

存储库将收到此信息,过滤结果并发布它们。

在另一端,“其他”片段(对选定的Alumnos感兴趣的片段)将侦听这些更改,并告知要显示的内容。

认为是:

FragmentOther启动并询问存储库:“给我显示的数据” 存储库将答复:这是校友名单。

如果用户更改了选择(在学生片段中),它将按照以前的操作进行操作,并告诉仓库:嘿,这又是选中的学生,他们已经更改了。

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

如果FragmentOther(问题)已打开,它将收到它;如果没有打开,它将收到当前列表,然后仓库将返回它。

所以您看到,所有这一切中的 key 是臭名昭著的关注点分离

每个类/对象必须承担最少的责任,并尽可能重用。

要使用现代 Android做法实现所有这些目标,建议您花时间学习:

LiveData,存储库模式和LifeCycle。

所有这些都是Android Jetpack的一部分。