如何在 ArrayList 中存储 ExpandableListView 的选定项 [英] How to store selected items of an ExpandableListView in an ArrayList

查看:19
本文介绍了如何在 ArrayList 中存储 ExpandableListView 的选定项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 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>selectedItems; 以及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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆