我正在使用可扩展列表视图分别在菜单中显示选项和子选项.进来的数据是正确的,但奇怪的是ListvIEw似乎为每个数据条目调用了两次getChild和getChildVIEw,因此它被添加到视图两次.它迭代,然后似乎再次迭代.
例:
分类:
-玩具
-电子产品
-汽车
-玩具
-电子产品
-汽车
预期:
分类:
-玩具
-电子产品
-汽车
我对Android和Java真的很陌生,所以我可能会犯一个菜鸟错误.我已经介入尝试找到一个重复数据的点,但我能找到的是getChild / getChildVIEw被调用两次.
这是expandableListVIEw适配器类:
public class expandablelistadapter extends Baseexpandablelistadapter { private Context context; private ArrayList<String> filterheaderList; // child data in format of header Title, child Title private HashMap<String, ArrayList<JsONObject>> filterOptionsMap; public expandablelistadapter(Context context, ArrayList<String> filterheaders, HashMap<String, ArrayList<JsONObject>> filterChildListMap) { this.context = context; this.filterheaderList = filterheaders; this.filterOptionsMap = filterChildListMap; } @OverrIDe public String[] getChild(int groupposition, int childPosititon) { JsONObject childobject = this.filterOptionsMap.get(this.filterheaderList.get(groupposition)).get(childPosititon); if (childobject != null) { Iterator<?> it = childobject.keys(); String key = null; String value = null; if (it.hasNext()) { key = it.next().toString(); try { value = childobject.getString(key); } catch (JsONException e) { e.printstacktrace(); } String[] data = new String[2]; data[0] = key; data[1] = value; return data; } else { return null; } } return null; } @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) { String childNum = null; String childText = null; final String[] childData = (String[]) getChild(groupposition, childposition); if (childData != null) { childNum = childData[0]; childText = childData[1]; } if (convertVIEw == null) { LayoutInflater infalinflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertVIEw = infalinflater.inflate(R.layout.ps_filter_sort_filter_expandable_child, null); } TextVIEw tvChildTitle = (TextVIEw) convertVIEw.findVIEwByID(R.ID.ps_filter_sort_filter_expandable_child_Title); tvChildTitle.setText(childText); tvChildTitle.setTag(R.ID.ps_filter_sort_filter_expandable_child_Title + groupposition + childposition, childNum); return convertVIEw; } @OverrIDe public int getChildrenCount(int groupposition) { return this.filterOptionsMap.get(this.filterheaderList.get(groupposition)).size(); } @OverrIDe public String getGroup(int groupposition) { return this.filterheaderList.get(groupposition); } @OverrIDe public int getGroupCount() { return this.filterheaderList.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.ps_filter_sort_filter_expandable_parent, null); } TextVIEw tvGroupTitle = (TextVIEw) convertVIEw.findVIEwByID(R.ID.ps_filter_sort_filter_expandable_parent_Title); tvGroupTitle.setTypeface(null, Typeface.BolD); tvGroupTitle.setText(headerTitle); return convertVIEw; } @OverrIDe public boolean hasStableIDs() { return false; } @OverrIDe public boolean isChildSelectable(int groupposition, int childposition) { return true; }}
然后我这样称呼它:
filterlistadapter = new expandablelistadapter(this.getActivity(), filterheaderList, filterOptionsMap); // setting List adapter expListVIEw.setAdapter(filterlistadapter); filterlistadapter.notifyDataSetChanged();
有理由以这种方式组织数据,我宁愿不介入.我可以说HashMap“filterOptionsMap”是正确的,它没有重复或“filterheaderList”
任何帮助将不胜感激.我找不到有类似问题的人,而且我一直在敲打键盘.
谢谢.
附:
您还需要点击组标题两次以使其折叠,但一旦打开.我不知道它是否是相关的或预期的行为,但我希望只需轻轻一点即可将其打开或关闭.奖金积分也可以提供帮助.
根据要求,这里有一些与HashMap相关的其他代码:
private voID prepareFilterListData(ArrayList<String> headerList, JsONObject[] categoryList, JsONObject[] sellerList, JsONObject[] typeList) { filterheaderArrayList = headerList; filterOptionsMap = new HashMap<String, ArrayList<JsONObject>>(); // Adding child data ArrayList<JsONObject> categorIEs = new ArrayList<JsONObject>(); if (categoryList != null && categoryList.length > 0) { for (JsONObject category : categoryList) { categorIEs.add(category); } } ArrayList<JsONObject> sellers = new ArrayList<JsONObject>(); if (sellerList != null && sellerList.length > 0) { for (JsONObject seller : sellerList) { sellers.add(seller); } } ArrayList<JsONObject> types = new ArrayList<JsONObject>(); if (typeList != null && typeList.length > 0) { for (JsONObject type : typeList) { types.add(type); } } filterOptionsMap.put(filterheaderArrayList.get(0), categorIEs); filterOptionsMap.put(filterheaderArrayList.get(1), sellers); filterOptionsMap.put(filterheaderArrayList.get(2), types);} filterheaderList = Directory.getFilterOptions(); filtercategoryList = Directory.getFilterCategorIEs(); filterSellerList = Directory.getFilterSellers(); filterTypeList = Directory.getFilterTypes(); // Forms data structures from given input if (filterheaderList != null && filtercategoryList != null && filterSellerList != null && filterTypeList != null) { prepareFilterListData(filterheaderList, filtercategoryList, filterSellerList, filterTypeList);private JsONObject[] getFilterTypes(JsONObject productSearchSettings, String filterTypes) { JsONArray typesObj; JsONObject[] types; try { typesObj = productSearchSettings.optJsONArray(filterTypes); if (typesObj != null) { types = new JsONObject[typesObj.length()]; for (int i = 0; i < typesObj.length(); i++) { String key = "type" + String.valueOf(i); String val = (String) typesObj.get(i).toString(); types[i] = new JsONObject().put(key, val); } return types; } else { return null; } } catch (JsONException e) { // Todo auto-generated catch block e.printstacktrace(); } return null;}private JsONObject[] getFilterSellers(JsONObject productSearchSettings, String filterSellers) { JsONObject sellersObj = null; JsONObject[] sellers; try { sellersObj = productSearchSettings.getJsONObject(filterSellers); if (sellersObj != null) { sellers = new JsONObject[sellersObj.length()]; Iterator<?> it = sellersObj.keys(); int i = 0; while (it.hasNext()) { String key = (String) String.valueOf(it.next().toString()); String val = sellersObj.getString(key); sellers[i] = new JsONObject().put(key, val); i++; } return sellers; } else { return null; } } catch (JsONException e) { // Todo auto-generated catch block e.printstacktrace(); } return null;}private JsONObject[] getFilterCategorIEs(JsONObject productSearchSettings, String filterCategorIEs) { JsONObject categorIEsObj = null; JsONObject[] categorIEs; try { categorIEsObj = productSearchSettings.getJsONObject(filterCategorIEs); if (categorIEsObj != null) { categorIEs = new JsONObject[categorIEsObj.length()]; Iterator<?> it = categorIEsObj.keys(); int i = 0; while (it.hasNext()) { String key = (String) String.valueOf(it.next().toString()); String val = categorIEsObj.getString(key); categorIEs[i] = new JsONObject().put(key, val); i++; } return categorIEs; } else { return null; } } catch (JsONException e) { // Todo auto-generated catch block e.printstacktrace(); } return null;}
如前所述,但是进入适配器的hashmap是正确的.我通过调试验证了.
解决方法:
我终于找到了.我非常感谢您的反馈和帮助.
在该组的单击事件中,我没有返回true表示已处理单击.我正在使用click事件来切换扩展.
我不知道为什么会导致重复,并且还需要两次单击才能关闭该组,但是为该组上的click事件切换该返回会产生重大影响.
总结以上是内存溢出为你收集整理的java – Android ExpandableListView填充两次全部内容,希望文章能够帮你解决java – Android ExpandableListView填充两次所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)