tutorial studio recyclerview lista item expandible ejemplo desplegable android expandablelistview android-adapterview

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.