2017-01-28 8 views
0

프로그래밍에 비교적 익숙하지 않습니다. 나는 이것이 매우 단순한 논리라고 생각하지만 나와 함께 견뎌야한다. 3 단계 확장 가능한 ListView에서 일하고 있습니다. 나는 완벽하게 작동하는 튜토리얼을 발견했다. 내 문제는 내가 다른 배열로 세 번째 수준을 채울 필요가있다. expandableListView의 세 번째 레이어에 다른 배열 채우기

내가 내 코드를 작성해야 확신이 내 array.xml

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

<string-array name="items_array_expandable_level_one"> 
    <item>Mobile</item> 
    <item>Laptops</item> 
    <item>VR</item> 
    <item>Misc</item> 
</string-array> 
<string-array name="items_array_expandable_level_one_one_child"> 
    <item>Samsung</item> 
    <item>iPhone</item> 
    <item>Nexus</item> 
</string-array> 
<string-array name="items_array_expandable_level_one_two_child"> 
    <item>Dell</item> 
    <item>HP</item> 
    <item>ACER</item> 
</string-array> 
<string-array name="items_array_expandable_level_two"> 
    <item>Mobile</item> 
    <item>Laptops</item> 
    <item>VR</item> 
    <item>Misc</item> 
</string-array> 
<string-array name="items_array_expandable_level_three_samsung"> 
    <item>Galaxy S4</item> 
    <item>Galaxy S5</item> 
    <item>Galaxy S6</item> 
    <item>Galaxy S7</item> 
</string-array> 
<string-array name="items_array_expandable_level_three_iPhone"> 
    <item>iPhone 4s</item> 
    <item>iPhone 5</item> 
    <item>iPhone SE</item> 
    <item>iPhone 7</item> 
</string-array> .... and so on 

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); 
     // SECOND LEVEL 
     String[] mItemHeaders = new String[0]; 
     mListData_SecondLevel_Map = new HashMap<>(); 
     int parentCount = mListDataHeader.size(); 
     for (int i = 0; i < parentCount; i++) { 
      String content = mListDataHeader.get(i); 
      Log.e("Content is: ", content); 
      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_level_two); 
      } 
      mListData_SecondLevel_Map.put(mListDataHeader.get(i), Arrays.asList(mItemHeaders)); 
     } 
     // THIRD LEVEL 
     String[] mItemChildOfChild; 
     List<String> listChild; 
     String contento = Arrays.toString(mItemHeaders); 
     Log.e("next content: ", contento); 
     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_samsung); 
        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 CustomExpandableListView secondLevelExpListView = new CustomExpandableListView(this.mContext); 
     String parentNode = (String) getGroup(groupPosition); 
     secondLevelExpListView.setAdapter(new SecondLevelAdapter(this.mContext, mListData_SecondLevel_Map.get(parentNode), mListData_ThirdLevel_Map)); 
     secondLevelExpListView.setGroupIndicator(null); 
     secondLevelExpListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() { 
      int previousGroup = -1; 
      @Override 
      public void onGroupExpand(int groupPosition) { 
       if (groupPosition != previousGroup) 
        secondLevelExpListView.collapseGroup(previousGroup); 
       previousGroup = groupPosition; 
      } 
     }); 
     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.expandable_list_second, parent, false); 
     } 
     TextView lblListHeader = (TextView) convertView 
       .findViewById(R.id.lblListHeader); 
     lblListHeader.setText(headerTitle); 
     return convertView; 
    } 

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

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

곳을 세 번째 수준을 말합니다. 두 번째 레이어 내가 그에 따라 채울 수있게되고있다. 제발 내가 어떻게 위의 코드에서 다른 배열을 채울 수있는 논리를 제공하십시오. 나는 내 문제로 분명히 희망한다. 미리 감사드립니다.

+0

@kinjal 제 문제로 저를 도울 수 있습니까? 당신이 내 질문을 편집 한 것을 봅니다. 네가 나를 도울 수 있다면 정말 기뻐할거야. –

답변

0

Op가이 Github 예제를 그의베이스로 사용하는 경우 : https://github.com/ngocchung/ThreeLevelExpListView을 사용하고 포함 된 SecondlevelAdapter도 사용하면 추가 된 코드 섹션이 문제를 해결해야합니다.

세 번째 레벨에는 두 번째 레벨의 전환 문과 일관된 switch 문을 추가해야합니다. 여기에는 XMl의 메뉴 항목에 따라 문자열 정의와 대소 문자가 변경되며 대소 ​​문자에 따라 mItemChildOfChild가 정의됩니다.

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); 
// SECOND LEVEL 
String[] mItemHeaders = new String[0]; 
mListData_SecondLevel_Map = new HashMap<>(); 
int parentCount = mListDataHeader.size(); 
for (int i = 0; i < parentCount; i++) { 
    String content = mListDataHeader.get(i); 
    Log.e("Content is: ", content); 
    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_level_two); 
    } 
    mListData_SecondLevel_Map.put(mListDataHeader.get(i), Arrays.asList(mItemHeaders)); 
} 
// THIRD LEVEL 
String[] mItemChildOfChild; 
List<String> listChild; 
String contento = Arrays.toString(mItemHeaders); 
Log.e("next content: ", contento); 
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++) { 
//newly inserted Code 

String content = stringList.get(i); 
switch (content) { 
case "Samsung": 
mItemChildOfChild = mContext.getResources().getStringArray(R.array.items_array_expandable_level_three_samsung); 
break; 
case "iPhone": //though I would change this to Apple and aswell in the Itemlist ;) :D 
mItemChildOfChild = mContext.getResources().getStringArray(R.array.items_array_expandable_level_three_iPhone); 
break; 
default: 
mItemChildOfChild = mContext.getResources().getStringArray(R.array.empty);} 

//end of new Code 

      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 CustomExpandableListView secondLevelExpListView = new 
CustomExpandableListView(this.mContext); 
String parentNode = (String) getGroup(groupPosition); 
secondLevelExpListView.setAdapter(new SecondLevelAdapter(this.mContext, 
mListData_SecondLevel_Map.get(parentNode), mListData_ThirdLevel_Map)); 
secondLevelExpListView.setGroupIndicator(null); 
secondLevelExpListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() { 
    int previousGroup = -1; 
    @Override 
    public void onGroupExpand(int groupPosition) { 
     if (groupPosition != previousGroup) 
      secondLevelExpListView.collapseGroup(previousGroup); 
     previousGroup = groupPosition; 
    } 
}); 
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.expandable_list_second, parent, false); 
} 
TextView lblListHeader = (TextView) convertView 
     .findViewById(R.id.lblListHeader); 
lblListHeader.setText(headerTitle); 
return convertView; 
} 

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

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

XML에서 새로 추가 된 문자열 배열 (빈 배열의). 더 우아한 해결책이 있을지 모르지만 나는 아직 어떻게해야할지 모르겠다.

+2

이것이 OP 문제를 어떻게 해결하는지 설명하십시오. 당신은 OP와 같은 사람입니까? –

+0

코드를 스크롤하면 새로 추가 된 섹션을 나타내는 "// 새로 삽입 된 코드"및 "// 새 코드의 끝"이 나타납니다. 이것은 세 번째 수준의 목록보기를 정리하고 Op의 문제를 해결하며 Op가 아닙니다. – jom

+0

더 자세히 설명하려면 질문을 편집해야합니다. –