我创建了一个片段,该片段又加载了两个带有单独片段(学生和问题)的选项卡。这两个片段是两个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调用,但不起作用。
答案 0 :(得分:1)
让我们开始说,片段之间的通信应该使用父活动,接口和一些粘合代码来完成。这个问题已被问过多次,而且也是A google documentation section。
话虽如此,您要做的我就是将数据与视图分开。
您选择的学生名单,不应存在于活动或片段中或对其进行修改。
您的活动(及其片段)仅仅是Android和框架提供的容器和策略委托(如果我可以使用Google的术语)。没有它们,您将无法拥有Android应用程序(至少一个显示UI的应用程序),因此您必须拥有它们。但这并不意味着您所有的代码都应该存在。
远离它。活动和片段本身很复杂(它们有很多事情要做),所以...
您的Fragment应该“询问其数据”以显示列表,并将更改推送到某个位置(我们将其称为存储库),因此一旦用户从列表中点击“ Alumno”,列表便会通知存储库: “嘿,这个校友被选中了”。
存储库将收到此信息,过滤结果并发布它们。
在另一端,“其他”片段(对选定的Alumnos感兴趣的片段)将侦听这些更改,并告知要显示的内容。
认为是:
FragmentOther启动并询问存储库:“给我显示的数据” 存储库将答复:这是校友名单。
如果用户更改了选择(在学生片段中),它将按照以前的操作进行操作,并告诉仓库:嘿,这又是选中的学生,他们已经更改了。
回购协议将再次过滤问题列表,并将其提供给任何有兴趣的人。
如果FragmentOther(问题)已打开,它将收到它;如果没有打开,它将收到当前列表,然后仓库将返回它。
所以您看到,所有这一切中的 key 是臭名昭著的关注点分离。
每个类/对象必须承担最少的责任,并尽可能重用。
要使用现代 Android做法实现所有这些目标,建议您花时间学习:
LiveData,存储库模式和LifeCycle。
所有这些都是Android Jetpack的一部分。