Problem does not work setOnChildClickListener in ExpandableListView

3

I have an ExpandebleListView as a menu in a navigationDrawer, I need to add event listenes to the child items, however I do exercise for each parent and child group, in the parent groups you can get the position with setOnGroupClickListener for children groups I used setOnChildClickListener , and with a Toast.makeText it shows me the null position, this I think is because the child group is related to a > HashMap but at the same time listHash is an object of type ElementoMenu a class from which it receives the parameters to load its images and texts and in this method the which would throw the listHash.get (childPosition) position, an integer data is displayed. I appreciate any help, then the code.

ExpandableListAdapter:

    public class ExpandableListAdapter extends BaseExpandableListAdapter {


    private Context context;
    private List<String> listDataHeader;
    private HashMap<String,List<ElementoMenu>> listElementosMenu;

    public ExpandableListAdapter(Context context, List<String> listDataHeader, HashMap<String, List<ElementoMenu>> listElementosMenu) {
        this.context = context;
        this.listDataHeader = listDataHeader;
        this.listElementosMenu = listElementosMenu;
    }

    @Override
    public int getGroupCount() {
        return listDataHeader.size();
    }

    @Override
    public int getChildrenCount(int i) {

        return listElementosMenu.get(listDataHeader.get(i)).size();
    }

    @Override
    public Object getGroup(int i) {
        return listDataHeader.get(i);
    }

    @Override
    public Object getChild(int i, int i1) {
        return listElementosMenu.get(listDataHeader.get(i)).get(i1);// i= Group item, i1 = childItem
    }

    @Override
    public long getGroupId(int i) {
        return i;
    }

    @Override
    public long getChildId(int i, int i1) {
        return i1;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {
        String headerTittle = (String)getGroup(i);
        if(view == null){
            LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.list_categoria,null);
        }
        TextView item_cate_name = (TextView)view.findViewById(R.id.list_item_cate_name);
        item_cate_name.setTypeface(null, Typeface.BOLD);
        item_cate_name.setText(headerTittle);
        return view;
    }

    @Override
    public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
        //Obtiene titulo.
        final String childText = listElementosMenu.get(listDataHeader.get(i)).get(i1).getTitulo();
        //Obtiene Imagen.
        final int childImg =  listElementosMenu.get(listDataHeader.get(i)).get(i1).getImagenResource();
        if(view == null){
            LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.list_subcategoria,null);
        }
        TextView item_name = (TextView)view.findViewById(R.id.list_item_name);
        item_name.setText(childText);
        ImageView item_icon = (ImageView)view.findViewById(R.id.list_item_scate_icon);
        item_icon.setImageResource(childImg);
        return view;
    }

    @Override
    public boolean isChildSelectable(int i, int i1) {
        return true;//*
    }
}

ElementoMenu:

    public class ElementoMenu {

    private String titulo;
    private int imagenResource;


    public ElementoMenu(String titulo, int imagenResource){
        this.titulo = titulo;
        this.imagenResource = imagenResource;
    }

    public int getImagenResource() {
        return imagenResource;
    }

    public void setImagenResource(int imagenResource) {
        this.imagenResource = imagenResource;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
}

MainActivity:

    public class MainActivity extends AppCompatActivity {

    //ExpandableListView
    private ExpandableListView listView;
    private ExpandableListAdapter listAdapter;
    private List<String> listDataHeader;
    private HashMap<String,List<ElementoMenu>> listHash;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        //ListView
        listView = (ExpandableListView)findViewById(R.id.ex_lits_menu);
        initData();
        listAdapter = new ExpandableListAdapter(this, listDataHeader,listHash);
        listView.setAdapter(listAdapter);//*

        //Tutorial: https://www.youtube.com/watch?v=oPGdPQvqPVM
        // Evento Grupo expandido
        listView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
                Toast.makeText(MainActivity.this, listDataHeader.get(groupPosition)+" was expanded", Toast.LENGTH_SHORT).show();
                return false;
            }
        });
        //Evento Grupo Contraido
        listView.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
            @Override
            public void onGroupCollapse(int groupPosition) {
                Toast.makeText(MainActivity.this, listDataHeader.get(groupPosition)+" was collapsed", Toast.LENGTH_SHORT).show();
            }
        });
        //Evento Child Item
        listView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                Toast.makeText(MainActivity.this, listDataHeader.get(groupPosition)+" was expanded", Toast.LENGTH_SHORT).show();
                //Integer in=(Integer)listHash;
                //int num = Integer.parseInt(String.valueOf(listHash));
                Toast.makeText(MainActivity.this, listHash.get(childPosition)+" was clicked", Toast.LENGTH_SHORT).show();
                return false;
            }
        });
    }

    //Cargue ListView
    private void initData() {

        listDataHeader = new ArrayList<>();
        listHash = new HashMap<>();

        listDataHeader.add("Portal");
        listDataHeader.add("Plataformas");
        listDataHeader.add("Redes Sociales");
        listDataHeader.add("Entretenimiento");

        List<ElementoMenu> itemMenus1 = new ArrayList<>();
        ElementoMenu elemento = new ElementoMenu("Home", R.drawable.img1);
        itemMenus1.add(elemento);
        elemento = new ElementoMenu("Biblioteca", R.drawable.img2);
        itemMenus1.add(elemento);
        elemento = new ElementoMenu("EduVirtual", R.drawable.img3);
        itemMenus1.add(elemento);
        elemento = new ElementoMenu("Directorio", R.drawable.img4);
        itemMenus1.add(elemento);
        elemento = new ElementoMenu("Preguntas", R.drawable.img1);
        itemMenus1.add(elemento);

        List<ElementoMenu> itemMenus2 = new ArrayList<>();
        elemento = new ElementoMenu("Siga", R.drawable.img1);
        itemMenus2.add(elemento);
        elemento = new ElementoMenu("Apoyo a la Presencialidad", R.drawable.img2);
        itemMenus2.add(elemento);
        elemento = new ElementoMenu("Virtualidad", R.drawable.img3);
        itemMenus2.add(elemento);

        List<ElementoMenu> itemMenus3 = new ArrayList<>();
        elemento = new ElementoMenu("Youtube", R.drawable.img1);
        itemMenus3.add(elemento);
        elemento = new ElementoMenu("Twitter", R.drawable.img2);
        itemMenus3.add(elemento);
        elemento = new ElementoMenu("Facebook", R.drawable.img3);
        itemMenus3.add(elemento);
        elemento = new ElementoMenu("Flicker", R.drawable.img4);
        itemMenus3.add(elemento);
        elemento = new ElementoMenu("Google +", R.drawable.img1);
        itemMenus3.add(elemento);
        elemento = new ElementoMenu("Instagram", R.drawable.img2);
        itemMenus3.add(elemento);
        elemento = new ElementoMenu("LinkedIn", R.drawable.img3);
        itemMenus3.add(elemento);

        List<ElementoMenu> itemMenus4 = new ArrayList<>();
        elemento = new ElementoMenu("Tour 360", R.drawable.img1);
        itemMenus4.add(elemento);
        elemento = new ElementoMenu("Juegos", R.drawable.img2);
        itemMenus4.add(elemento);

        listHash.put(listDataHeader.get(0),itemMenus1);
        listHash.put(listDataHeader.get(1),itemMenus2);
        listHash.put(listDataHeader.get(2),itemMenus3);
        listHash.put(listDataHeader.get(3),itemMenus4);
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
    
asked by Ivan Alfredo 27.10.2017 в 17:42
source

1 answer

5

Good morning Alfredo, in this case your Adapter must return true in the method:

   @Override
    public boolean isChildSelectable(int i, int i1) {
        return true;
    }

this to be able to allow the listener in the "child" elements of ExpandableListView .

The correct way to get the value of the child within HashMap is through its "Key" , in this case you can get it by listDataHeader.get(groupPosition) containing the texts that are the " key ", therefore to obtain an object:

listHash.get(listDataHeader.get(groupPosition)).get(childPosition)

and to get a property simply call the getter, example the title:

listHash.get(listDataHeader.get(groupPosition)).get(childPosition).getTitulo()

This would be the code:

   //Evento Child Item
    listView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
        @Override
        public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
            Toast.makeText(MainActivity.this, listDataHeader.get(groupPosition)+" was expanded", Toast.LENGTH_SHORT).show();

            Toast.makeText(MainActivity.this, listHash.get(listDataHeader.get(groupPosition)).get(childPosition).getTitulo()+" was clicked", Toast.LENGTH_SHORT).show();
            return false;
        }
    });
    
answered by 27.10.2017 / 18:12
source