如何在 ArrayList 中存储 ExpandableListView 的选定项 [英] How to store selected items of an ExpandableListView in an ArrayList
问题描述
我在 ExpandableListView
中有一个用户列表,现在我有 2 组列表,现在我正在尝试创建一个 ArrayList
来添加数据当我点击用户时,所以如果有 2 组学校并且我点击每个学校的学生,我应该在我的阵列中有 2 个位置,每个包含其各自用户的组一个,我的问题是,我的阵列有 2 个位置但它并没有将学生分开:
I have a list of users inside of an ExpandableListView
, for now I have 2 groups of list, now I'm trying to create an ArrayList
that will add data as I click on the users, so if have 2 groups of schools and I click on a student of each one I should have 2 positions in my array, one for each group containing its respective users, my problem is, my array has 2 positions but it is not separating the students:
我想要的是这个:
A 学校:
选择了学生 1
学生 2
student3 被选中
student3 selected
B 学校:
学生 4
student5 被选中
student5 selected
导致:
[0]-> 学生 1,3 [1] ->学生 5
[0]-> student 1,3 [1] ->student 5
这是我目前尝试过的:
mGpsEscolas = new GPSEscolas();
mArrayEscolas = new ArrayList<GPSEscolas>();
aMap = new HashMap<String, GPSEscolas>();
ExpandList.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(final ExpandableListView parent, View v, final int groupPosition, final int childPosition, final long id) {
ExpAdapter.setClicked(groupPosition, childPosition);
index = parent.getFlatListPosition(ExpandableListView.getPackedPositionForChild(groupPosition, childPosition));
parent.setItemChecked(index, true);
parent.setSelectedChild(groupPosition, childPosition, true);
parent.getChildAt(index);
IdAlunos = String.valueOf(mMainRest.mArrayList.get(groupPosition).getalunos().get(childPosition).getId_aluno());
IdEscola = String.valueOf(mMainRest.mArrayList.get(groupPosition).getId_escola());
ids_alunos.add(IdAlunos);
notificar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int groupCount = ExpandList.getExpandableListAdapter().getGroupCount();
for (int group = 1; group <= groupCount; group++) {
int gcount = ExpandList.getExpandableListAdapter().getChildrenCount(groupPosition);
mArrayEscolas = new ArrayList<GPSEscolas>();
for (int child = 1; child <= gcount; child++) {
mGpsEscolas.setIds_alunos(String.valueOf(IdAlunos).substring(1));
mGpsEscolas.setId_escola(Integer.valueOf(IdEscola));
mGpsEscolas.setLatitude(latitudeEscola);
mGpsEscolas.setLongitude(longitudeEscola);
mGpsEscolas.setDistancia(mMainRest.RaioEscola);
mArrayEscolas.add(mGpsEscolas);
if (ExpAdapter.isChildSelectable(groupPosition, childPosition)) {
aMap.put(ExpandList.getExpandableListAdapter().getChildId(group, child), mArrayEscolas);
}
}
}
}
});
return false;
}
});
推荐答案
还有一条路要走.您可以创建 Map<group,List<child>> 而不是创建包装器对象.选择的项目
并将项目添加到此列表的方式几乎相同,通过侦听此事件:
There is one more way to go. Instead of creating wrapper object you can create Map<group,List<child>> selected items
and add items to this list pretty much the same way, by listening this event:
mExpandableList.setOnChildClickListener(new OnChildClickListener() {
@Override public boolean onChildClick(ExpandableListView parent,
View v,int groupPosition, int childPosition, long id) {
//toggle selections code here
}
所以这里是重要的部分:(和完整工作 github 仓库 )
So here is important part: (and full working github repo )
@Override
protected void onCreate(Bundle savedInstanceState) {
...// some init part
final MyAdapter adapter = new MyAdapter(schools, students);
listView.setAdapter(adapter);
listView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent,
View v, int groupPosition, int childPosition, long id) {
adapter.toggleSelection(groupPosition, childPosition);
adapter.notifyDataSetInvalidated();
return false;
}
});
}
我们有几个选项可以放置此类选定项目映射,但在我的项目中,我在自定义适配器类中使用它.没有真正需要自定义适配器,可以将 Map
以及Activity中的相关函数(toggleSelection、isSelected、getSelectedItems),但是我们仍然需要突出selected sells,所以通常adapter是最好的放置位置.
We have several options where to put such selected items map, but in my project I use it in custom adapter class. There is no real need for custome adapter, and it is possible to put Map<G, List<C>> selectedItems;
and related functions (toggleSelection, isSelected, getSelectedItems) in Activity, but we still need to highlight selected sells, so adapter usually is the best place to put it.
private class MyAdapter<G, C> extends BaseExpandableListAdapter {
private List<G> groups;
private Map<G, List<C>> childMap;
private Map<G, List<C>> selectedItems;
public MyAdapter(List<G> groups, Map<G, List<C>> childMap){
this.groups = groups;
this.childMap = childMap;
this.selectedItems = new HashMap<>();
}
public boolean isSelected(int groupPosition, int childPosition){
G group = groups.get(groupPosition);
// getChild is adapter Fn and is the same as
// G group = groups.get(groupPosition)
// C child = childMap.get(group).get(childPosition);
C child = getChild(groupPosition, childPosition);
List<C> sel = selectedItems.get(group);
return sel != null && sel.contains(child);
}
public void toggleSelection(int groupPosition, int childPosition){
G group = groups.get(groupPosition);
C child = getChild(groupPosition,childPosition);
List<C> sel = selectedItems.get(group);
if (sel == null){
sel = new ArrayList<>(); // Lasy arrays creation
//can init all arrays in constructor and never check for nulls
selectedItems.put(group, sel);
}
if (sel.contains(child)) sel.remove(child);
else sel.add(child);
}
... // Adapter fns can find in git repo
将结果 Map 转换为 List 将是一件容易的事:
And convert result Map to List will be an easy task:
private ArrayList<String> selectedAsList(Map<String, List<String>> selectedItems){
ArrayList<String> result = new ArrayList<>();
for(List<String> students: selectedItems.values())
result.addAll(students);
return result;
}
或类似的东西.
附注.你也可以使用 Map
.它几乎可以是任何你想要的数据结构.如果您的组数据中没有重复项,则为 2 个数组,或者可能只有 1 个单个数组.你可以控制它,限制选择的数量等等...
PS. You can also play with Map<group,List<child>>
.It can be pretty much any
data structure you want it to be. 2 arrays or maybe just 1 single array if you don't have duplicates in your group data. You can control it, limit the number of selections and so on...
这篇关于如何在 ArrayList 中存储 ExpandableListView 的选定项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!