studio - lista expandible android
ExpandableListView-UnsupportedOperationException: addView(View, LayoutParams) no es compatible con AdapterView (5)
Estoy implementando la vista de lista desplegable en android y obtengo el error titulado anterior. Por favor, ayúdame.
La actividad principal es -
package com.expand;
import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.Toast;
public class MyExpandableListViewActivity extends Activity {
/** Called when the activity is first created. */
static final String groupElements[]= {
"India",
"Australia",
"England",
"South Africa"
};
static final String[][] childElements=
{
{
"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 expandList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
expandList = (ExpandableListView)findViewById(R.id.expandList1);
metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
width = metrics.widthPixels;
//ExpAdapter adapter = new ExpAdapter(MyExpandableListViewActivity.this, groupElements, childElements);
expandList.setAdapter(new ExpAdapter(MyExpandableListViewActivity.this, groupElements, childElements));
expandList.setIndicatorBounds(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10));
expandList.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
@Override
public void onGroupExpand(int groupPosition) {
// TODO Auto-generated method stub
Log.e("onGroupExpand", "OK");
}
});
expandList.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int groupPosition) {
// TODO Auto-generated method stub
Log.e("onGroupCollapse", "OK");
}
});
expandList.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
//getting the item that is selected
//String s = (String) expandList.getItemAtPosition((int) id);
Toast.makeText(MyExpandableListViewActivity.this, "You have selected :" , Toast.LENGTH_SHORT).show();
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);
}
}
La clase ExpAdapter es - He implementado el adaptador en otra clase y lo he llamado en la actividad principal de mt
package com.expand;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;
public class ExpAdapter extends BaseExpandableListAdapter {
public Context myContext;
public String[][] childElements;
TextView childValues;
public String[] groupElements;
public ExpAdapter(Context context, String[] group, String[][] childs)
{
this.myContext=context;
this.groupElements = group;
this.childElements = childs;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return childElements[groupPosition][childPosition];
}
@Override
public long getChildId(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(convertView==null){
LayoutInflater inflator = (LayoutInflater)myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflator.inflate(R.layout.child_rows, parent);
}
childValues = (TextView)convertView.findViewById(R.id.rowValues);
childValues.setText(childElements[groupPosition][childPosition]);
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
// TODO Auto-generated method stub
return groupElements[groupPosition].length();
}
@Override
public Object getGroup(int groupPosition) {
// TODO Auto-generated method stub
return groupElements[groupPosition];
}
@Override
public int getGroupCount() {
// TODO Auto-generated method stub
return groupElements.length;
}
@Override
public long getGroupId(int groupPosition) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(convertView==null){
LayoutInflater inflator = (LayoutInflater)myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflator.inflate(R.layout.group_rows, null);
}
TextView group = (TextView)convertView.findViewById(R.id.groupId);
group.setText(groupElements[groupPosition]);
return convertView;
}
@Override
public boolean hasStableIds() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return true;
}
}
main.xml-
este es el xnl que se muestra al principio por la actividad principal
<?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" >
<ExpandableListView
android:id="@+id/expandList1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/android:empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
</TextView>
</ExpandableListView>
</LinearLayout>
group_row.xml
este es el xml para los elementos del grupo
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gropu_name"
android:layout_width="fill_parent"
android:layout_height="40dp"
android:orientation="vertical" >
<TextView
android:id="@+id/groupId"
android:layout_height="40dp"
android:layout_width="wrap_content"
android:paddingLeft="30dp"
android:gravity="center_vertical"
android:textSize="16dp"
android:textStyle="bold"
/>
</LinearLayout>
child_row.xml este es el xml para los elementos secundarios
<?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="40dp"
android:orientation="horizontal" >
<TextView
android:id="@+id/rowValues"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:gravity="center_vertical"
android:paddingLeft="50dp"
android:textSize="12dp" />
</LinearLayout>
Como se señaló anteriormente,
En lugar de no usar un padre, simplemente debe decirle al Inflater que no adjunte la vista inflada al padre con
convertView = inflator.inflate(R.layout.child_rows, parent, false);
Ver también esta respuesta .
La razón es que el adaptador se encarga de adjuntar vistas al propio padre.
Este error también puede deberse a la función de ejecución instantánea . Estaba trabajando en ListView y debido a esta aplicación de error seguí bloqueando. Desinstalar la aplicación y ejecutar nuevamente resolvió el error.
Parece que Adapterview no permite agregar una nueva vista, encontré el mismo problema
Resuélvelo reemplazando la siguiente línea
convertView = inflator.inflate(R.layout.child_rows, parent);
a
convertView = inflator.inflate(R.layout.child_rows, null);
Según Android Lint, su vista secundaria siempre debe proporcionar una referencia a su vista principal cuando está inflada. Tuve exactamente el mismo error en mi código. Se estaba produciendo porque TextView se colocó dentro de ExpandableListView. Cuando reordené mi diseño xml, el error dejó de aparecer.
Tenga en cuenta que también puede obtener este error cuando su distribución xml no sea válida.