2012-02-02 13 views
6

Quiero hacer que solo un elemento de la lista principal se expanda a la vez, mi código para onCreate es actualmente el siguiente. (Funciona como yo quiero, sino el método para permitir que sólo un padre abierto en un tiempo no funciona)ExpandableLists en Android, quiero permitir que solo una lista primaria se expanda a la vez

public void onCreate(Bundle savedInstanceState) { 
     try{ 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

     final SimpleExpandableListAdapter expListAdapter = 
      new SimpleExpandableListAdapter(
         //FOR LEVEL 1 SCREEN 
        this, 
        createGroupList(),    // METHOD TO CREATE PARENTLIST Creating group List. 
        R.layout.group_row,    // REF TO XML FILENAME.   
        new String[] { "Group Item" }, // STRING ARRAY HOLDING ONE KEY THAT REF'S ALL PARENT LIST ITEMS. 
        new int[] { R.id.row_name }, // REF TO I.D. OF PARENT XML. ID of each group item.-Data under the key goes into this TextView.      
        createChildList(),    // METHOD TO CREATE CHILD LST. childData describes second-level entries. 
        R.layout.child_row,    // XMLFILE NAME FOR CHILD LIST.Layout for sub-level entries(second level). 
        new String[] {"Sub Item"},  // KEY FOR CHILD ITEMS IN HASHMAP. Keys in childData maps to display. 
        new int[] { R.id.grp_child}  // XML ID FOR TEXTVIEW. Data under the keys above go into these TextViews. 
       ); 
      setListAdapter(expListAdapter);  // setting the adapter in the list. 

     //**THIS IS WHAT I DONT KNOW HOW TO CODE:** 


      list = (ExpandableListView) findViewById(R.id.row_name); 
      list.setAdapter(expListAdapter); 
      list.setGroupIndicator(null); 


      list.setOnGroupExpandListener(new OnGroupExpandListener() { 

       public void onGroupExpand(int groupPosition) { 
        int len = expListAdapter.getGroupCount(); 
        for (int i = 0; i < len; i++) { 
         if (i != groupPosition) { 
          list.collapseGroup(i); 
         } 
        } 
       } 
      }); 

     }catch(Exception e){ 

      System.out.println("Errrr +++ " + e.getMessage()); 
     } 
    } 

entiendo el código anterior, sin embargo, yo no uso expandableListViews, Im refferncing mi programa a mi .xml archivos con los diseños de la lista desplegable. Y así que no sé cómo aplicar lo anterior a mi programa ...

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<ExpandableListView android:id="@+id/list" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:background="@drawable/bkg"/> 

    <TextView android:id="@+id/android:empty" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:text="No items"/> 
</LinearLayout> 

El método que no sé cómo aplicar es la siguiente:

    list = (ExpandableListView) findViewById(R.id.row_name); 
      list.setAdapter(expListAdapter); 
      list.setGroupIndicator(null); 

      list.setOnGroupExpandListener(new OnGroupExpandListener() { 
        public void onGroupExpand(int groupPosition) { 
        int len = expListAdapter.getGroupCount(); 
        for (int i = 0; i < len; i++) { 
         if (i != groupPosition) { 
          list.collapseGroup(i); 
         } 
        } 
       } 
      }); 

1) ¿cómo refiero la 'lista' a mi actividad expandiblelist?

lista se define en la clase como private ExpandableListView list;

no tengo ningún error en este momento, pero el método no funciona.

¡Cualquier ayuda es muy apreciada!

+0

Todavía estoy atascado en este .. – user1180937

+0

¿No hay manera de que pueda topar esto en la parte superior de los listados? – user1180937

+0

puede encontrar la solución en el siguiente enlace: http://stackoverflow.com/questions/4314777/programmatically-collapse-a-group-in-expandablelistview –

Respuesta

1

El problema se resolvió mediante la creación de una variable expplant pública llamada lista y luego haciendo referencia al adaptador a la vista con la siguiente llamada.

list = getExpandableListView(); 

El método de expansión anterior se colgaba de la aplicación debido a esto. Después de hacer referencia al list.collapsegroup, funcionó bien.

public void onGroupExpand(int groupPosition) { 
        System.out.println("GROUP LISTENER WORKS?"); 
        if(adptr=="expListAdapter"){ 
         int len = expListAdapter.getGroupCount(); 
         //System.out.println(len); 
         for (int i = 0; i < len; i++) { 
          if (i != groupPosition) { 
          list.collapseGroup(i); 
          } 
         } 

        } 
        else if(adptr=="expListAdapter2"){ 
         int len = expListAdapter2.getGroupCount(); 
         for (int i = 0; i < len; i++) { 
          if (i != groupPosition) { 
          list.collapseGroup(i); 
          } 
         } 
         //System.out.println(len); 
        } 
        else if(adptr=="expListAdapter3"){ 
         int len = expListAdapter3.getGroupCount(); 
         for (int i = 0; i < len; i++) { 
          if (i != groupPosition) { 
          list.collapseGroup(i); 
          } 
         } 

        } 
      } 
3

creo una solución recta hacia adelante sería la implementación de un adaptador para manejar cualquiera de los eventos de su interés en.

public class MyExpandableListAdapter extends SimpleExpandableListAdapter { 

    public Activity mActivity; 

    public MyExpandableListAdapter([ARGS USED IN QUESTION], Activity activity) {super([ARGS USED IN QUESTIONS]); mActivity = activity; } 

    // then just override the method 
    public void onGroupExpanded(int groupPosition) { 
    int len = super.getGroupCount(); 
    ExpandableListView list = (ExpandableListView) mActivity.findViewById(R.id.list); 
    for (int i = 0; i < len; i++) { 
     if (i != groupPosition) { 
      list.collapseGroup(i); 
     } 
    } 
    } 
} 

Al separar el adaptador de la lista en otra clase que no estorbará la Código de actividad con implementaciones de oyentes únicos. En cambio, en cada actividad simplemente una instancia del adaptador y la puso en la lista

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // No try catch needed 
    MyExpandableListAdapter mAdapter = new MyExpandableListAdapter([ARGS SHOWN IN QUESTION], MainActivity.this); 

    ExpandableListView epView = (ExpandableListView) findViewById(R.id.list); 
    epView.setAdapter(mAdapter); 

    return true; 
} 
+0

Recomendaría este enfoque, ya que limita la reutilización del adaptador y conduce a un acoplamiento hermético innecesario entre el adaptador y la actividad y el diseño. En cambio, propondría una solución basada en oyentes (como la respuesta de Itam) – Makibo

18
// Declare variable 
private static int prev = -1; 
// and OnGroupExpandListener implement 


mExpandableList.setOnGroupExpandListener(new OnGroupExpandListener() { 

      @Override 
      public void onGroupExpand(int groupPosition) { 

       if(prev!=-1) 
       { 

        mExpandableList.collapseGroup(prev);  

       } 
       prev=groupPosition; 
      } 
     }); 

Actualizando con solución actualizada

mExpandableList.setOnGroupExpandListener(new OnGroupExpandListener() { 
    // Keep track of previous expanded parent 
    int previousGroup = -1; 

    @Override 
    public void onGroupExpand(int groupPosition) { 
     // Collapse previous parent if expanded. 
     if ((previousGroup != -1) && (groupPosition != previousGroup)) { 
      mExpandableList.collapseGroup(previousGroup); 
     } 
     previousGroup = groupPosition; 
    } 
}); 
+6

Cambie la marca "prev! = - 1" a "prev! = - 1 && prev! = GroupPosition", o no puede expandir un grupo dos veces en secuencia . –

+0

O puede agregar un OnGroupCollapseListener y establecer prev = -1. – JWqvist

0
@Override 
    public void onGroupExpanded(int groupPosition) { 
     super.onGroupExpanded(groupPosition); 
     int len = getGroupCount(); 

     for (int i = 0; i < len; i++) { 
      if (i != groupPosition) { 
       expListView.collapseGroup(i); 
      } 
     } 
    } 
0

Modificado la respuesta de Iram Así puede reabrir el mismo grupo

// Listview Group expanded listener 
    expListView.setOnGroupExpandListener(new OnGroupExpandListener() { 

     @Override 
     public void onGroupExpand(int groupPosition) { 
      if (prevouriousExpandedGroupNumber != -1 && prevouriousExpandedGroupNumber != groupPosition) { 
       expListView.collapseGroup(prevouriousExpandedGroupNumber); 
      } 
      prevouriousExpandedGroupNumber = groupPosition; 
     } 
    }); 
4

enfoque más fácil

Puede implementar ExpandableListView.OnGroupExpandListener, en donde se ejecuta collapseGroup() para todos los grupos de listas, excepto el que está siendo hecho clic. Esto hará lo que quieras.

expandableList.setOnGroupExpandListener(new OnGroupExpandListener() { 
     int previousGroup = -1; 

     @Override 
     public void onGroupExpand(int groupPosition) { 
      if(groupPosition != previousGroup) 
       expandableList.collapseGroup(previousGroup); 
      previousGroup = groupPosition; 
     } 
    }); 
0

Iram Bukhari la respuesta está funcionando bien. pero lo hice una vez cambio:

private static int prev = -1; 
// and OnGroupExpandListener implement 


mExpandableList.setOnGroupExpandListener(new OnGroupExpandListener() { 

      @Override 
      public void onGroupExpand(int groupPosition) { 

       if(prev!=-1 && prev!=groupPosition) 
       { 

        mExpandableList.collapseGroup(prev);  

       } 
       prev=groupPosition; 
      } 
     }); 

He añadido prev! = groupPosition como condición adicional. Porque si

item 1 has clicked(opened) 
item 1 has clicked(closed) 
item 1 has clicked(Not opening. because prev has same position so the item is opened and collapsed immediatly) 

después de agregar la condición

item 1 has clicked(opened) 
item 1 has clicked(closed) 
item 1 has clicked(opened) 
0

enter image description hereSu trabajo Ver Pantallas

package com.keshav.myexpandablelistviewexampleworkinginactivity; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.ExpandableListView; 
import android.widget.ExpandableListView.OnChildClickListener; 
import android.widget.ExpandableListView.OnGroupClickListener; 
import android.widget.ExpandableListView.OnGroupCollapseListener; 
import android.widget.ExpandableListView.OnGroupExpandListener; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

public class MainActivity extends Activity { 

    ExpandableListAdapter listAdapter; 
    ExpandableListView expListView; 
    List<String> listDataHeader; 
    HashMap<String, List<String>> listDataChild; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // tODO get the listview 
     expListView = (ExpandableListView) findViewById(R.id.lvExp); 

     // TODO preparing list data 
     prepareListData(); 

     listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild); 

     // setting list adapter 
     expListView.setAdapter(listAdapter); 

     // Listview Group click listener 
     expListView.setOnGroupClickListener(new OnGroupClickListener() { 

      @Override 
      public boolean onGroupClick(ExpandableListView parent, View v, 
             int groupPosition, long id) { 
       Toast.makeText(getApplicationContext(), 
         "Group Clicked " + listDataHeader.get(groupPosition), 
         Toast.LENGTH_SHORT).show(); 
       return false; 
      } 

     }); 

     // Listview Group expanded listener 
     expListView.setOnGroupExpandListener(new OnGroupExpandListener() { 

      // TODO Colapse Here Using this... in android 
      int previousGroup = -1; 
      boolean flag = false; 

      @Override 
      public void onGroupExpand(int groupPosition) { 

       Log.e("keshav", "onGroupClick is -> " + groupPosition); 

       Toast.makeText(getApplicationContext(), 
         listDataHeader.get(groupPosition) + " Expanded", 
         Toast.LENGTH_SHORT).show(); 

       if (groupPosition != previousGroup && flag) { 
        expListView.collapseGroup(previousGroup); 
       } 
       previousGroup = groupPosition; 

       flag = true; 

      } 
     }); 


     // Listview Group collasped listener 
     expListView.setOnGroupCollapseListener(new OnGroupCollapseListener() { 

      @Override 
      public void onGroupCollapse(int groupPosition) { 
       Toast.makeText(getApplicationContext(), 
         listDataHeader.get(groupPosition) + " Collapsed", 
         Toast.LENGTH_SHORT).show(); 

      } 
     }); 


     // Todo Listview on child click listener 
     expListView.setOnChildClickListener(new OnChildClickListener() { 

      @Override 
      public boolean onChildClick(ExpandableListView parent, View v, 
             int groupPosition, int childPosition, long id) { 
       // TODO Auto-generated method stub 
       Toast.makeText(
         getApplicationContext(), 
         listDataHeader.get(groupPosition) 
           + " : " 
           + listDataChild.get(
           listDataHeader.get(groupPosition)).get(
           childPosition), Toast.LENGTH_SHORT) 
         .show(); 
       return false; 
      } 
     }); 
    } 

    /* 
    * Preparing the list data 
    */ 
    private void prepareListData() { 
     listDataHeader = new ArrayList<String>(); 
     listDataChild = new HashMap<String, List<String>>(); 

     // Adding child data 
     listDataHeader.add("Months"); 
     listDataHeader.add("Top 250"); 
     listDataHeader.add("Now Showing"); 
     listDataHeader.add("Coming Soon.."); 


     // Adding child data 
     List<String> weeks = new ArrayList<String>(); 
     weeks.add("Sunday"); 
     weeks.add("Monday"); 
     weeks.add("Tuesday"); 
     weeks.add("Wednesday"); 
     weeks.add("Thursday"); 
     weeks.add("Friday"); 
     weeks.add("Saturday"); 


     // Adding child data 
     List<String> top250 = new ArrayList<String>(); 
     top250.add("Om Shanti Om"); 
     top250.add("Badshah"); 
     top250.add("Bahubali Part 1"); 
     top250.add("Carry on Jatta"); 
     top250.add("Sholey"); 
     top250.add("Mard"); 
     top250.add("Dewwar"); 


     List<String> nowShowing = new ArrayList<String>(); 
     nowShowing.add("Bahubali"); 
     nowShowing.add("Kabali"); 
     nowShowing.add("Luckky Di Unlukky Story"); 
     nowShowing.add("Sachin Billions Dream"); 
     nowShowing.add("Red 2"); 

     List<String> comingSoon = new ArrayList<String>(); 
     comingSoon.add("Tubelight "); 
     comingSoon.add("Bahubali 3 2018"); 
     comingSoon.add("Dhoom 4"); 
     comingSoon.add("Hindi Medium"); 

     listDataChild.put(listDataHeader.get(0), weeks); 
     listDataChild.put(listDataHeader.get(1), top250); // Header, Child data 
     listDataChild.put(listDataHeader.get(2), nowShowing); 
     listDataChild.put(listDataHeader.get(3), comingSoon); 
    } 
} 


ExpandableListAdapter 


package com.keshav.myexpandablelistviewexampleworkinginactivity; 

import java.util.HashMap; 
import java.util.List; 

import android.content.Context; 
import android.graphics.Typeface; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseExpandableListAdapter; 
import android.widget.TextView; 

public class ExpandableListAdapter extends BaseExpandableListAdapter { 

    private Context _context; 
    private List<String> _listDataHeader; // header titles 
    // child data in format of header title, child title 
    private HashMap<String, List<String>> _listDataChild; 

    public ExpandableListAdapter(Context context, List<String> listDataHeader, 
      HashMap<String, List<String>> listChildData) { 
     this._context = context; 
     this._listDataHeader = listDataHeader; 
     this._listDataChild = listChildData; 
    } 

    @Override 
    public Object getChild(int groupPosition, int childPosititon) { 
     return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
       .get(childPosititon); 
    } 

    @Override 
    public long getChildId(int groupPosition, int childPosition) { 
     return childPosition; 
    } 

    @Override 
    public View getChildView(int groupPosition, final int childPosition, 
      boolean isLastChild, View convertView, ViewGroup parent) { 

     final String childText = (String) getChild(groupPosition, childPosition); 

     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.list_item, null); 
     } 

     TextView txtListChild = (TextView) convertView 
       .findViewById(R.id.lblListItem); 

     txtListChild.setText(childText); 
     return convertView; 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
     return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
       .size(); 
    } 

    @Override 
    public Object getGroup(int groupPosition) { 
     return this._listDataHeader.get(groupPosition); 
    } 

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

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

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, 
      View convertView, ViewGroup parent) { 
     String headerTitle = (String) getGroup(groupPosition); 
     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.list_group, null); 
     } 

     TextView lblListHeader = (TextView) convertView 
       .findViewById(R.id.lblListHeader); 
     lblListHeader.setTypeface(null, Typeface.BOLD); 
     lblListHeader.setText(headerTitle); 

     return convertView; 
    } 

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

    @Override 
    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     return true; 
    } 

} 


activity_mail.xml 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:background="#f4f4f4" > 

      <ExpandableListView 
       android:id="@+id/lvExp" 
       android:layout_height="match_parent" 
       android:layout_width="match_parent" 
       android:cacheColorHint="#00000000"/> 

</LinearLayout> 


list_grou.xml 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="8dp" 
    android:background="#000000"> 


    <TextView 
     android:id="@+id/lblListHeader" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft" 
     android:textSize="17dp" 
     android:textColor="#f9f93d" /> 

</LinearLayout> 


list_item.xml 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="55dip" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/lblListItem" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="17dip" 
     android:paddingTop="5dp" 
     android:paddingBottom="5dp" 
     android:textColor="#000000" 
     android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft" /> 

</LinearLayout> 
+0

Cuestiones relacionadas