2013-03-08 2 views
3

Я разрабатываю трехуровневое расширяемое listview в Android. но мои дочерние узлы заполняются в двух экземплярах. Вот мой исходный код:Повторение детей в Расширяемый списокView android

public class CarPanel extends ExpandableListActivity { 

    static ArrayList<String> groupItem = new ArrayList<String>(); 
    static ArrayList<String> childItem = new ArrayList<String>(); 
    static ArrayList<Object> grandChildItem = new ArrayList<Object>(); 
    static public ArrayList<String> childValue; 
    static public ArrayList<String> grandChildValue; 

    EditText modelType, price, dyp, insurance; 

    static int dummyFlag = 0; 
    public LayoutInflater minflater; 
    public Activity activity; 

    private MyDBManager dbManager; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  
     //Remove title bar 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     //Remove notification bar  
     this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     dbManager = new MyDBManager(this); 
     dbManager.open(); 

     ExpandableListView expandbleLis = getExpandableListView(); 
     expandbleLis.setDividerHeight(2); 
     expandbleLis.setGroupIndicator(null); 
     expandbleLis.setClickable(true); 

     // 1st level data  
     setGroupData(); 

     // 2nd level data 
     setChildGroupData(); 

     // 3rd level data 
     setGrandChildGroupData(); 

     ParentLevel parentAdapter = new ParentLevel(groupItem); 
     parentAdapter.setInflater((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE), this); 
     getExpandableListView().setAdapter(parentAdapter); 
     expandbleLis.setOnChildClickListener(this); 

    } 

    public class ParentLevel extends BaseExpandableListAdapter { 


     public ParentLevel(ArrayList<String> groupList) { 
      groupItem = groupList; 
     } 

     public Object getChild(int arg0, int arg1) { 
      return arg1; 
     } 

     public void setInflater(LayoutInflater mInflater, Activity act) { 
      minflater = mInflater; 
      activity = act; 
     } 


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


     public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
      CustExpListview SecondLevelexplv = new CustExpListview(CarPanel.this); 
      SecondLevelexplv.setAdapter(new SecondLevelAdapter(childItem, grandChildItem)); 
      SecondLevelexplv.setGroupIndicator(null); 

      return SecondLevelexplv; 
     } 


     public int getChildrenCount(int groupPosition) { 
      Log.v("childItem.size()", "childItem.size() " +childItem.size()); 
      return childItem.size(); 
     } 


     public Object getGroup(int groupPosition) { 
      return groupPosition; 
     } 


     public int getGroupCount() { 
      Log.v("groupItem.size()", "groupItem.size() " +groupItem.size()); 
      return groupItem.size(); 
     } 


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

     public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 
      if (convertView == null) { 
       convertView = minflater.inflate(R.layout.grouprow, null); 
      } 
      ((CheckedTextView) convertView).setText(groupItem.get(groupPosition)); 
      ((CheckedTextView) convertView).setChecked(isExpanded); 
      return convertView; 
     } 


     public boolean hasStableIds() { 
      return true; 
     } 


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

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

    class SecondLevelAdapter extends BaseExpandableListAdapter { 

     public LayoutInflater minflater; 
     public Context activity; 

    public SecondLevelAdapter(ArrayList<String> childList, ArrayList<Object> grandChildList) { 
      childItem = childList; 
      grandChildItem = grandChildList; 
     } 

     public void setInflater(LayoutInflater mInflater, Context parentLevel) { 
      minflater = mInflater; 
      activity = parentLevel; 
     } 

     public Object getChild(int groupPosition, int childPosition) { 
      return childPosition; 
     } 


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


     @SuppressWarnings("unchecked") 
     public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
      grandChildValue = (ArrayList<String>) grandChildItem.get(groupPosition); 
      EditText modelType, price, dyp, insurance; 
      if (convertView == null) { 
       LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       convertView = layoutInflater.inflate(R.layout.grandchildrow, null); 
      } 

      modelType = (EditText) convertView.findViewById(R.id.et_ModelType); 
      price = (EditText) convertView.findViewById(R.id.et_Price); 
      dyp = (EditText) convertView.findViewById(R.id.et_DYP); 
      insurance = (EditText) convertView.findViewById(R.id.et_Insurance); 

      modelType.setText(grandChildValue.get(childPosition)); 

      convertView.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        Toast.makeText(getBaseContext(), grandChildValue.get(childPosition), Toast.LENGTH_SHORT).show(); 
       } 
      }); 


      return convertView; 
     } 


     public int getChildrenCount(int groupPosition) { 
      return ((ArrayList<String>) grandChildItem.get(groupPosition)).size(); 
     } 


     public Object getGroup(int groupPosition) { 
      return groupPosition; 
     } 

     public int getGroupCount() { 
      return childItem.size(); 
     } 


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


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

      if (convertView == null) { 
       LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       convertView = layoutInflater.inflate(R.layout.childrow, null); 
      } 
      ((CheckedTextView) convertView).setText(childItem.get(groupPosition)); 
      ((CheckedTextView) convertView).setChecked(isExpanded); 
      return convertView; 

     } 


     public boolean hasStableIds() { 
      return true; 
     } 


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

    } 

    public void setGroupData() { 
     groupItem.clear(); 

     Cursor cursor = dbManager.execQuery("SELECT DISTINCT carName FROM model"); 
     final List<ModelBean> modelList = new ArrayList<ModelBean>(); 
     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) { 
      ModelBean beanObj = cursorToModel(cursor); 
      modelList.add(beanObj); 
      cursor.moveToNext(); 
     } 
     // Make sure to close the cursor 
     cursor.close(); 
     ModelBean modelObj = null; 

     if (modelList.size() > 0) 
     { 
      for (int i = 0; i < modelList.size(); i++) 
      { 
       modelObj = modelList.get(i); 
       String carName = modelObj.getCarName();    
       groupItem.add(carName); 
      } 
     } 
    }  

    public void setChildGroupData() { 

     childItem.clear(); 

     childItem.add("Android"); 

     childItem.add("iOS"); 

     childItem.add("HTC"); 

    } 

    public void setGrandChildGroupData() { 
     grandChildItem.clear(); 

     ArrayList<String> child = new ArrayList<String>(); 
     child.add("PASSAT 1"); 
     child.add("PASSAT 2"); 
     grandChildItem.add(child); 

     child = new ArrayList<String>(); 
     child.add("POLO 1"); 
     child.add("POLO 2"); 
     grandChildItem.add(child); 

     child = new ArrayList<String>(); 
     child.add("VITZ 1"); 
     child.add("VITZ 2"); 
     grandChildItem.add(child); 

    } 

    private ModelBean cursorToModel(Cursor cursor) 
     { 
      ModelBean modelBean = new ModelBean(); 
      modelBean.setCarName(cursor.getString(0)); 

     return modelBean; 
     } 
} 

Теперь я хочу этот код блока повторить только один раз для каждой родительской группы однако повторить три раза. Я искал гораздо больше и аналогичные вопросы, но не пришел к решению.

Android

IOS

HTC

+0

У вас проблема? Если да, то как? – AbhishekB

+1

Да, я нашел решение. Отправленный для будущей ссылки [здесь] (http://naeemgik.blogspot.com/2013/08/android-expandablelistview-example.html) – sns

ответ

6

я боролся с этой же проблемой и не смогли найти решение в любом месте сети/SO.

После выполнения некоторых протоколирования я пришел к выводу, что родительский уровень BaseExpandbleAdapater вызовет/создаст дочерний элемент, соответствующий количеству детей в вашем наборе данных/группе. К сожалению, это нежелательно в трехуровневом сценарии вложенных списков.

Так при генерации списка трехуровневого, просто сделать функцию getChildrenCount в родительском адаптере, как это:

@Override 
    public ing getChildrenCount(int groupPosition){ 
     return 1; 
    } 

Теперь это будет только строить «1» итерацию списка детей пунктов, даже несмотря на то, 1 вложенный список может содержать любое количество детей, которое затем с точки зрения адаптера ребенка становится группой.

Это сбивает с толку, потому что ваш дочерний/вложенный адаптер управляет отображением фактических «детей», тогда как в одном вложенном списке ваши дети обрабатываются в том же классе родительского адаптера. В этом случае дочерний/вложенный адаптер будет обрабатывать отображение того, что будет дочерними, как его собственный groupView, что делает число детей в родительском адаптере неактуальным. По крайней мере, это то, что показывают мои результаты и окружающая среда ...

Надеюсь, что я мог бы помочь, это меня заколотило на полтора дня.

+1

Спасибо, приятель, я борюсь с этой проблемой почти с недели. – Sid

Смежные вопросы