2011-06-30 17 views
11

Estoy tratando de utilizar una costumbre ExpandableListView con el padre y el diseño niño con un padre XML y XML niño.Android lista ampliable

Mis datos serían una respuesta del servidor. Por lo tanto, preferentemente gustaría tener datos en forma de una lista o matriz hash de ruta para padres e hijos diseños

Estoy incluyendo las imágenes de lo que quiero.

¿Hay alguna manera de cambiar la imagen de flecha de la lista expandible (por defecto) por cualquier + o - la representación de interfaz de usuario, como se muestra a continuación.

List

List1

Para sugerir un tutorial o lógica de código para esta situación específica.

Respuesta

5

Mientras tanto He creado una selector.xml como:

<?xml version="1.0" encoding="UTF-8"?> 

<selector xmlns:android="schemas.android.com/apk/res/android" > 

    <item 
     android:drawable="@drawable/friend_small" 
     android:state_expanded="true"/> 

    <item android:drawable="@drawable/place_small"/> 
</selector> 

y dada en android:groupIndicator="@drawable/selector" en XML - friend_small y colocar pequeñas son mis imágenes de ampliar y colapsado,

3

que puede cambiar el indicador llamando setGroupIndicator

listas expandibles son capaces de mostrar un indicador al lado de cada elemento para mostrar el estado actual del tema (los estados suelen ser una de grupo ampliado, grupo colapsaron, niño, o último hijo). Use setChildIndicator (Drawable) o setGroupIndicator (Drawable) (o los atributos XML correspondientes) para establecer estos indicadores (consulte los documentos de cada método para ver el estado adicional que puede tener Drawable).

Además, necesita su propia implementación de ExpandableListAdapter. es posible inflar sus propios puntos de vista para padres e hijos.

6

Después de una R & D sobre lista ampliable encontró que expandible Lista-vista es una vista de árbol de dos niveles proporcionado por Android.

Esta vista contiene dos tipos de categorías.

primer tipo es Grupo-Elementos y segundo es Niño-Elementos, también llamado matriz y elementos secundarios.

El principal objetivo de este ejemplo es para personalizar la vista de lista desplegable, puesto que la imagen en los espectáculos de interrogación.

He cubierto algunos temas importantes acerca de la vista de lista expandible que tuve que enfrentar durante mis experiencias.

El siguiente código es main.xml contiene la vista de lista expansible. 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/android:list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:groupindicator="@drawable/group_indicator.xml"> 

    <textview android:id="@+id/android:empty" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="@string/main_no_items">  
</textview></expandablelistview></linearlayout> 

la group_row.xml es el siguiente que contiene el diseño para ampliable grupo de lista de vista structure.group_row.xml ?

 <textview android:id="@+id/tvGroupName" android:layout_width="wrap_content" android:layout_height="40dip" android:textsize="16sp" android:textstyle="bold" android:paddingleft="30dip" android:gravity="center_vertical"> 

child_row.xml se trata contiene el diseño de la lista ampliable estructura de vista de grupo. child_row.xml

<!--?xml version="1.0" encoding="utf-8"?--> 
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="40dip" android:gravity="center_vertical"> 

    <textview android:id="@+id/tvPlayerName" android:paddingleft="50dip" android:textsize="14sp" android:layout_width="wrap_content" android:layout_height="30dip" android:gravity="center_vertical"> 

</textview></linearlayout> 

Primera leer la referencia de la vista de lista ampliable de XML a la clase de actividad.

public class ExpList extends ExpandableListActivity 
    { 
    /** 
     * strings for group elements 
     */ 
     static final String arrGroupelements[] = 
     { 
     "India", 
     "Australia", 
     "England", 
     "South Africa" 
    }; 

     /** 
     * strings for child elements 
     */ 
    static final String arrChildelements[][] = 
    { 
     { 
     "Sachin Tendulkar", 
     "Raina", 
     "Dhoni", 
     "Yuvi" 
     }, 
     { 
     "Ponting", 
     "Adam Gilchrist", 
     "Michael Clarke" 
     }, 
     { 
     "Andrew Strauss", 
     "kevin Peterson", 
     "Nasser Hussain" 
     }, 
     { 
     "Graeme Smith", 
     "AB de villiers", 
     "Jacques Kallis" 
     } 
     }; 

    DisplayMetrics metrics; 
    int width; 
    ExpandableListView expList; 

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

      expList = getExpandableListView(); 
      metrics = new DisplayMetrics(); 
      getWindowManager().getDefaultDisplay().getMetrics(metrics); 
      width = metrics.widthPixels; 
      //this code for adjusting the group indicator into right side of the view 


if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { 
      expList.setIndicatorBounds(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10)); 
     } else { 
      expList.setIndicatorBoundsRelative(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10)); 
     } 

      expList.setAdapter(new ExpAdapter(this)); 

     expList.setOnGroupExpandListener(new OnGroupExpandListener() 
     { 
     @Override 
     public void onGroupExpand(int groupPosition) 
     { 
     Log.e("onGroupExpand", "OK"); 
     } 
     }); 

     expList.setOnGroupCollapseListener(new OnGroupCollapseListener() 
     { 
     @Override 
     public void onGroupCollapse(int groupPosition) 
     { 
     Log.e("onGroupCollapse", "OK"); 
     } 
     }); 

     expList.setOnChildClickListener(new OnChildClickListener() 
     { 
     @Override 
     public boolean onChildClick(ExpandableListView parent, View v, 
     int groupPosition, int childPosition, long id) { 
     Log.e("OnChildClickListener", "OK"); 
     return false; 
     } 
     }); 
     } 

     public int GetDipsFromPixel(float pixels) 
     { 
     // Get the screen's density scale 
     final float scale = getResources().getDisplayMetrics().density; 
     // Convert the dps to pixels, based on density scale 
     return (int) (pixels * scale + 0.5f); 
     } 
    } 

Para personalizar la lista ExpView, lo principal es el adaptador. Android proporciona BaseExpandableListAdapter para personalizar la vista. Bellow es el código para el diseño de Adapter.

Este es un adaptador para la vista de lista expandible para construir los elementos de grupo y secundarios.

public class ExpAdapter extends BaseExpandableListAdapter { 

    private Context myContext; 
    public ExpAdapter(Context context) { 
    myContext = context; 
    } 
    @Override 
    public Object getChild(int groupPosition, int childPosition) { 
    return null; 
    } 

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

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

    if (convertView == null) { 
    LayoutInflater inflater = (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    convertView = inflater.inflate(R.layout.child_row, null); 
    } 

    TextView tvPlayerName = (TextView) convertView.findViewById(R.id.tvPlayerName); 
    tvPlayerName.setText(arrChildelements[groupPosition][childPosition]); 

    return convertView; 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
    return arrChildelements[groupPosition].length; 
    } 

    @Override 
    public Object getGroup(int groupPosition) { 
    return null; 
    } 

    @Override 
    public int getGroupCount() { 
    return arrGroupelements.length; 
    } 

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

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, 
    View convertView, ViewGroup parent) { 

    if (convertView == null) { 
    LayoutInflater inflater = (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    convertView = inflater.inflate(R.layout.group_row, null); 
    } 

    TextView tvGroupName = (TextView) convertView.findViewById(R.id.tvGroupName); 
    tvGroupName.setText(arrGroupelements[groupPosition]); 

    return convertView; 
    } 

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

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

group_indicator.xml Este código para cambiar la imagen indicador predeterminado.

<?xml version="1.0" encoding="UTF-8"?> 
    <selector xmlns:android="http://schemas.android.com/apk/res/android"> 
     <item android:state_expanded="true" android:drawable="@drawable/friend_small" /> 
     <item android:drawable="@drawable/place_small" /> 
    </selector> 
+0

Después de la I + D, he implementado un código que utiliza una lista expansible personalizada con el diseño principal y secundario para que sea mi group_row. XML y child_row. XML. –

+0

También ,, Alinee el colapso predeterminado y expanda la imagen a la derecha ... Como se requiere en mi diseño ... –

+0

ExpandableListView no puede tener vistas secundarias (en el xml). – ddmps

Cuestiones relacionadas