Cómo agregar tres niveles ListView en ExpandableListView en android

Quiero agregar un nivel más de en ExpandableListView.In actual ExpandableListView es de dos niveles, ¿cómo puedo añadir un nivel más. Soy nuevo en el androide que se convierte por favor me ayuda. ¡Gracias por adelantado!

Mi MainActivity.java:-

private Toolbar mToolbar; ExpandableListAdapter listAdapter; ExpandableListView expListView; List<String> listDataHeader; HashMap<String, List<String>> listDataChild; // private FragmentDrawer drawerFragment; ArrayList<String> arraylist1,arraylist2,arraylist3,arrayList4,arrayList5; int cnt = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mToolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(mToolbar); getSupportActionBar().setDisplayShowHomeEnabled(true); expListView = (ExpandableListView) findViewById(R.id.lvExp); // preparing list data prepareListData(); listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild); // setting list adapter expListView.setAdapter(listAdapter); /* drawerFragment = (FragmentDrawer) getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer); drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), mToolbar); drawerFragment.setDrawerListener(this);*/ // display the first navigation drawer view on app launch // displayView(0); Log.d("oncreate method", ""); arraylist1 = new ArrayList<String>(); arraylist2 = new ArrayList<String>(); arraylist3 = new ArrayList<String>(); arrayList4 = new ArrayList<String>(); arrayList5 = new ArrayList<String>(); new ProductsAsynTask().execute("http://opencart.codeniques.com/shopping/?route=feed/web_api/menu&key=test123$"); } private void prepareListData() { listDataHeader = new ArrayList<String>(); listDataChild = new HashMap<String, List<String>>(); // Adding child data listDataHeader.add("Top 250"); listDataHeader.add("Now Showing"); listDataHeader.add("Coming Soon.."); // Adding child data List<String> top250 = new ArrayList<String>(); top250.add("The Shawshank Redemption"); top250.add("The Godfather"); top250.add("The Godfather: Part II"); top250.add("Pulp Fiction"); top250.add("The Good, the Bad and the Ugly"); top250.add("The Dark Knight"); top250.add("12 Angry Men"); List<String> nowShowing = new ArrayList<String>(); nowShowing.add("The Conjuring"); nowShowing.add("Despicable Me 2"); nowShowing.add("Turbo"); nowShowing.add("Grown Ups 2"); nowShowing.add("Red 2"); nowShowing.add("The Wolverine"); List<String> comingSoon = new ArrayList<String>(); comingSoon.add("2 Guns"); comingSoon.add("The Smurfs 2"); comingSoon.add("The Spectacular Now"); comingSoon.add("The Canyons"); comingSoon.add("Europa Report"); listDataChild.put(listDataHeader.get(0), top250); // Header, Child data listDataChild.put(listDataHeader.get(1), nowShowing); listDataChild.put(listDataHeader.get(2), comingSoon); } public class ProductsAsynTask extends AsyncTask<String,Void,Void>{ ProgressDialog dialog; protected void onPreExecute(){ super.onPreExecute(); Log.d("In onPreExceute",""); dialog = new ProgressDialog(MainActivity.this); dialog.setMessage("Loading, Please wait"); dialog.setTitle("Connecting server"); dialog.show(); dialog.setCancelable(false); } protected Void doInBackground(String... param){ try{ Log.d("In doInBackground",""); HttpClient client= new DefaultHttpClient(); HttpPost post = new HttpPost(param[0]); HttpResponse response = client.execute(post); int status = response.getStatusLine().getStatusCode(); if(status == 200){ Log.d("Status",""+status); HttpEntity entity = response.getEntity(); String data = EntityUtils.toString(entity); JSONObject jsonObject = new JSONObject(data); JSONArray jArray = jsonObject.getJSONArray("categories"); for(int i = 0;i < jArray.length();i++){ cnt++; Log.d("value of array",jArray.length()+""); Log.d("Value of i",""+i); JSONObject jsonObject1 = jArray.getJSONObject(i); arraylist1.add(jsonObject1.getString("name")); //data1 = jsonObject1.getString("name"); // Log.d("hello ",data1); JSONArray jsonArray = jsonObject1.getJSONArray("children"); // JSONObject jsonObject2 = jsonObject1.getJSONObject("children"); for(int j=0;j<jsonArray.length();j++){ JSONObject jsonObject2 = jsonArray.getJSONObject(j); arraylist2.add(jsonObject2.getString("name")); // data2 = jsonObject2.getString("name"); JSONArray jsonArray1 = jsonObject2.getJSONArray("children_lv3"); for(int k=0;k<jsonArray1.length();k++){ JSONObject jsonObject3 = jsonArray1.getJSONObject(k); arraylist3.add(jsonObject3.getString("name")); arrayList4.add(jsonObject3.getString("href")); /* data3 = jsonObject3.getString("name"); data4 = jsonObject3.getString("href"); */ } arrayList5.add(jsonObject2.getString("href")); // data5 = jsonObject2.getString("href"); } } } }catch(IOException e){ Log.e("Error IOException :",e.getMessage()); }catch (JSONException e){ Log.e("Error JSONException",e.getMessage()); } return null; } protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); dialog.dismiss(); Log.d("Counter value",""+cnt); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } if(id == R.id.action_search){ Toast.makeText(getApplicationContext(), "Search action is selected!", Toast.LENGTH_SHORT).show(); return true; } return super.onOptionsItemSelected(item); } /* public void onDrawerItemSelected(View view, int position) { displayView(position); } private void displayView(int position) { Fragment fragment = null; String title = getString(R.string.app_name); switch (position) { case 0: fragment = new HomeFragment(); title = getString(R.string.title_home); break; case 1: fragment = new FriendsFragment(); title = getString(R.string.title_friends); break; case 2: fragment = new MessagesFragment(); title = getString(R.string.title_messages); break; default: break; } if (fragment != null) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.container_body, fragment); fragmentTransaction.commit(); // set the toolbar title getSupportActionBar().setTitle(title); } }*/} 

Mi ExpandableListAdapter.java está aquí: –

 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; }} 

Mi activity_main.xml está aquí: –

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:id="@+id/container_toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <include android:id="@+id/toolbar" layout="@layout/toolbar" /> </LinearLayout> <FrameLayout android:id="@+id/container_body" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout> <ExpandableListView android:id="@+id/lvExp" android:layout_height="match_parent" android:layout_width="260dp" android:layout_gravity="start"/> <!-- <fragment android:id="@+id/fragment_navigation_drawer" android:name="com.android.ShoppingMazza.activity.ExpandableListAdapter" android:layout_width="@dimen/nav_drawer_width" android:layout_height="match_parent" android:layout_gravity="start" app:layout="@layout/fragment_navigation_drawer" tools:layout="@layout/fragment_navigation_drawer" /> --> </android.support.v4.widget.DrawerLayout> 

Puede probar mi siguiente código de ejemplo. He publicado mi proyecto completo en GitHub

Por supuesto, debe modificar más para satisfacer todas sus necesidades. Para el caso básico, sólo utilizo el origen de datos en el archivo arrays.xml . ¡Espero que esto ayude!

Arrays.xml:

 <resources> <string-array name="items_array_expandable_level_one"> <item>Level 1.1</item> <item>Level 1.2</item> <item>Level 1.3</item> </string-array> <string-array name="items_array_expandable_level_one_one_child"> <item>Level 1.1.1</item> <item>Level 1.1.2</item> </string-array> <string-array name="items_array_expandable_level_one_two_child"> <item>Level 1.2.1</item> </string-array> <string-array name="items_array_expandable_other_child"> <item>Second Level 01</item> <item>Second Level 02</item> <item>Second Level 03</item> </string-array> <string-array name="items_array_expandable_level_three"> <item>Child Level 01</item> <item>Child Level 02</item> </string-array> </resources> 

CustomExpListView.java:

 public class CustomExpListView extends ExpandableListView { public CustomExpListView(Context context) { super(context); } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { widthMeasureSpec = MeasureSpec.makeMeasureSpec(960, MeasureSpec.AT_MOST); heightMeasureSpec = MeasureSpec.makeMeasureSpec(600, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } 

ParentLevelAdapter.java:

 public class ParentLevelAdapter extends BaseExpandableListAdapter { private final Context mContext; private final List<String> mListDataHeader; private final Map<String, List<String>> mListData_SecondLevel_Map; private final Map<String, List<String>> mListData_ThirdLevel_Map; public ParentLevelAdapter(Context mContext, List<String> mListDataHeader) { this.mContext = mContext; this.mListDataHeader = new ArrayList<>(); this.mListDataHeader.addAll(mListDataHeader); // Init second level data String[] mItemHeaders; mListData_SecondLevel_Map = new HashMap<>(); int parentCount = mListDataHeader.size(); for (int i = 0; i < parentCount; i++) { String content = mListDataHeader.get(i); switch (content) { case "Level 1.1": mItemHeaders = mContext.getResources().getStringArray(R.array.items_array_expandable_level_one_one_child); break; case "Level 1.2": mItemHeaders = mContext.getResources().getStringArray(R.array.items_array_expandable_level_one_two_child); break; default: mItemHeaders = mContext.getResources().getStringArray(R.array.items_array_expandable_other_child); } mListData_SecondLevel_Map.put(mListDataHeader.get(i), Arrays.asList(mItemHeaders)); } // THIRD LEVEL String[] mItemChildOfChild; List<String> listChild; mListData_ThirdLevel_Map = new HashMap<>(); for (Object o : mListData_SecondLevel_Map.entrySet()) { Map.Entry entry = (Map.Entry) o; Object object = entry.getValue(); if (object instanceof List) { List<String> stringList = new ArrayList<>(); Collections.addAll(stringList, (String[]) ((List) object).toArray()); for (int i = 0; i < stringList.size(); i++) { mItemChildOfChild = mContext.getResources().getStringArray(R.array.items_array_expandable_level_three); listChild = Arrays.asList(mItemChildOfChild); mListData_ThirdLevel_Map.put(stringList.get(i), listChild); } } } } @Override public Object getChild(int groupPosition, int childPosition) { return childPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final CustomExpListView secondLevelExpListView = new CustomExpListView(this.mContext); String parentNode = (String) getGroup(groupPosition); secondLevelExpListView.setAdapter(new SecondLevelAdapter(this.mContext, mListData_SecondLevel_Map.get(parentNode), mListData_ThirdLevel_Map)); secondLevelExpListView.setGroupIndicator(null); return secondLevelExpListView; } @Override public int getChildrenCount(int groupPosition) { return 1; } @Override public Object getGroup(int groupPosition) { return this.mListDataHeader.get(groupPosition); } @Override public int getGroupCount() { return this.mListDataHeader.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 layoutInflater = (LayoutInflater) this.mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = layoutInflater.inflate(R.layout.drawer_list_group, parent, false); } TextView lblListHeader = (TextView) convertView .findViewById(R.id.lblListHeader); lblListHeader.setTypeface(null, Typeface.BOLD); lblListHeader.setTextColor(Color.CYAN); lblListHeader.setText(headerTitle); return convertView; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } 

SecondLevelAdapter.java:

 public class SecondLevelAdapter extends BaseExpandableListAdapter { private final Context mContext; private final List<String> mListDataHeader; private final Map<String, List<String>> mListDataChild; public SecondLevelAdapter(Context mContext, List<String> mListDataHeader, Map<String, List<String>> mListDataChild) { this.mContext = mContext; this.mListDataHeader = mListDataHeader; this.mListDataChild = mListDataChild; } @Override public Object getChild(int groupPosition, int childPosition) { return this.mListDataChild.get(this.mListDataHeader.get(groupPosition)) .get(childPosition); } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final String childText = (String) getChild(groupPosition, childPosition); if (convertView == null) { LayoutInflater layoutInflater = (LayoutInflater) this.mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = layoutInflater.inflate(R.layout.drawer_list_item, parent, false); } TextView txtListChild = (TextView) convertView .findViewById(R.id.lblListItem); txtListChild.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); txtListChild.setText(childText); return convertView; } @Override public int getChildrenCount(int groupPosition) { try { return this.mListDataChild.get(this.mListDataHeader.get(groupPosition)).size(); } catch (Exception e) { return 0; } } @Override public Object getGroup(int groupPosition) { return this.mListDataHeader.get(groupPosition); } @Override public int getGroupCount() { return this.mListDataHeader.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 layoutInflater = (LayoutInflater) this.mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = layoutInflater.inflate(R.layout.drawer_list_group_second, parent, false); } TextView lblListHeader = (TextView) convertView .findViewById(R.id.lblListHeader); lblListHeader.setText(headerTitle); lblListHeader.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); lblListHeader.setTextColor(Color.YELLOW); return convertView; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } 

MainActivity.java:

 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.content_main); // Init top level data List<String> listDataHeader = new ArrayList<>(); String[] mItemHeaders = getResources().getStringArray(R.array.items_array_expandable_level_one); Collections.addAll(listDataHeader, mItemHeaders); ExpandableListView mExpandableListView = (ExpandableListView) findViewById(R.id.expandableListView_Parent); if (mExpandableListView != null) { ParentLevelAdapter parentLevelAdapter = new ParentLevelAdapter(this, listDataHeader); mExpandableListView.setAdapter(parentLevelAdapter); } } } 

Resultado de la captura de pantalla:

Vista de lista ampliable de tres niveles

Activity_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:layout_width="fill_parent" android:id="@+id/ParentLevel" android:groupIndicator="@null" android:layout_height="fill_parent"> </ExpandableListView> </LinearLayout> 

MainActivity.Java

 import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.ListView; import android.widget.TextView; import android.widget.LinearLayout.LayoutParams; public class Home extends Activity { ExpandableListView explvlist; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); explvlist = (ExpandableListView)findViewById(R.id.ParentLevel); explvlist.setAdapter(new ParentLevel()); } public class ParentLevel extends BaseExpandableListAdapter { @Override public Object getChild(int arg0, int arg1) { return arg1; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) { CustExpListview SecondLevelexplv = new CustExpListview(Home.this); SecondLevelexplv.setAdapter(new SecondLevelAdapter()); SecondLevelexplv.setGroupIndicator(null); return SecondLevelexplv; } @Override public int getChildrenCount(int groupPosition) { return 3; } @Override public Object getGroup(int groupPosition) { return groupPosition; } @Override public int getGroupCount() { return 5; } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { TextView tv = new TextView(Home.this); tv.setText("->FirstLevel"); tv.setBackgroundColor(Color.BLUE); tv.setPadding(10, 7, 7, 7); return tv; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } public class CustExpListview extends ExpandableListView { int intGroupPosition, intChildPosition, intGroupid; public CustExpListview(Context context) { super(context); } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { widthMeasureSpec = MeasureSpec.makeMeasureSpec(960, MeasureSpec.AT_MOST); heightMeasureSpec = MeasureSpec.makeMeasureSpec(600, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } public class SecondLevelAdapter extends BaseExpandableListAdapter { @Override public Object getChild(int groupPosition, int childPosition) { return childPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { TextView tv = new TextView(Home.this); tv.setText("child"); tv.setPadding(15, 5, 5, 5); tv.setBackgroundColor(Color.YELLOW); tv.setLayoutParams(new ListView.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); return tv; } @Override public int getChildrenCount(int groupPosition) { return 5; } @Override public Object getGroup(int groupPosition) { return groupPosition; } @Override public int getGroupCount() { return 1; } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) { TextView tv = new TextView(Home.this); tv.setText("-->Second Level"); tv.setPadding(12, 7, 7, 7); tv.setBackgroundColor(Color.RED); return tv; } @Override public boolean hasStableIds() { // TODO Auto-generated method stub return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { // TODO Auto-generated method stub return true; } } } 

En este caso, debe crear su propia clase expandible.

Consulte este enlace. http://androidcodesnips.blogspot.in/2011/09/three-level-expandable-list.html

  • Girar la imagen en sentido horario usando LibGDX
  • Cómo inicializar un SparseArray estático
  • Enum VS Static Class (Normal y con valores de cadena)
  • ¿Es posible ejecutar applets Java en el navegador WebKit de Android?
  • ¿Cómo puedo interceptar el flujo de audio en un dispositivo Android?
  • Java Java FATAL EXCEPTION java.lang.NullPointerException
  • Libgdx MainMenuScreen
  • Genymotion Plugin no se puede mostrar en Eclipse
  • Empaque el código android en el archivo jar
  • Androide HttpResponse siempre muere segunda vez que se llama
  • PDF Viewer API para android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.