Java Android ExpandableListView已填充两次
我使用一个可扩展的列表视图在菜单中分别显示选项和子选项。输入的数据是正确的,但奇怪的是,listview似乎为每个数据条目调用了两次getChild和getChildView,因此它被添加到视图中两次。它迭代通过,然后似乎再次迭代通过 例如: 类别: -玩具 -电子学 -汽车 -玩具 -电子学 -汽车 预期: 类别: -玩具 -电子学 -汽车 我对Android和Java真的很陌生,所以我可能犯了一个新手错误。我已经试着找到一个复制数据的点,但我能找到的只是getChild/getChildView被调用了两次 以下是expandableListView适配器类:Java Android ExpandableListView已填充两次,java,android,json,expandablelistview,Java,Android,Json,Expandablelistview,我使用一个可扩展的列表视图在菜单中分别显示选项和子选项。输入的数据是正确的,但奇怪的是,listview似乎为每个数据条目调用了两次getChild和getChildView,因此它被添加到视图中两次。它迭代通过,然后似乎再次迭代通过 例如: 类别: -玩具 -电子学 -汽车 -玩具 -电子学 -汽车 预期: 类别: -玩具 -电子学 -汽车 我对Android和Java真的很陌生,所以我可能犯了一个新手错误。我已经试着找到一个复制数据的点,但我能找到的只是getChild/getChildVi
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;
}
}
数据以这种方式组织是有原因的,我不想深入讨论。我能说的是HashMap“FilterOptions Map”是正确的,它或“filterHeaderList”中没有重复项
任何帮助都将不胜感激。我一直没能找到有类似问题的人,为此我一直在敲击键盘
多谢各位
p.S。
您还需要轻触组标题两次,以使其崩溃,但一次打开。我不知道这是否是相关的或预期的行为,但我希望它是一个单一的点击切换它打开或关闭。这方面的帮助还可获得额外积分。
根据要求,这里有一些与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;
}
private void prepareFilterListData(ArrayList标题列表、JSONObject[]类别列表、JSONObject[]sellerList、JSONObject[]类型列表){
filterHeaderArrayList=标题列表;
filterOptionsMap=新HashMap();
//添加子数据
ArrayList categories=新的ArrayList();
if(categoryList!=null&&categoryList.length>0){
for(JSONObject类别:categoryList){
类别。添加(类别);
}
}
ArrayList sellers=新的ArrayList();
if(sellerList!=null&&sellerList.length>0){
对于(JSONObject卖方:卖方列表){
卖方。添加(卖方);
}
}
ArrayList类型=新的ArrayList();
if(typeList!=null&&typeList.length>0){
for(JSONObject类型:类型列表){
类型。添加(类型);
}
}
filterOptionMap.put(filterHeaderArrayList.get(0),categories);
filterOptionMap.put(filterHeaderArrayList.get(1),卖方);
filterOptionMap.put(filterHeaderArrayList.get(2),类型);
}
filterHeaderList=目录。getFilterOptions();
filterCategoryList=目录。getFilterCategories();
filterSellerList=Directory.getFilterSellers();
filterTypeList=目录。getFilterTypes();
//根据给定的输入形成数据结构
如果(filterHeaderList!=null&&filterCategoryList!=null&&filterSellerList!=null&&filterTypeList!=null){
PrepareFilterList数据(filterHeaderList、filterCategoryList、filterSellerList、filterTypeList);
私有JSONObject[]getFilterTypes(JSONObject productSearchSettings,字符串filterTypes){
JSONArray typesObj;
JSONObject[]类型;
试一试{
typesObj=productSearchSettings.optJSONArray(过滤器类型);
if(typesObj!=null){
types=新的JSONObject[typesObj.length()];
对于(int i=0;i
如前所述,进入适配器的hashmap是正确的。我通过调试进行了验证。Hmmm…很抱歉,我仍然没有看到任何导致这种行为的原因。通常这可能是由于无意中添加了新内容。通常是因为从适配器外部修改了数据 在您的情况下,
filterHeaderList
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; }
expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
parent.expandGroup(groupPosition); // delete this
Log.d(TAG, "onGroupClick: ");
return false;
}
});