如果组的孩子计数为零,则 ExpandableListview 会出现 IndexOutOfBoundsException
ExpandableListview getting IndexOutOfBoundsException if group's childeren counts are Zero
希望你们一切都好。好吧,我在一个小问题上浪费了将近 2 天(48 小时)。我正在与 expandablelistview
一起工作,我列表的一些组有 children,其余为空没有 children。当列表有 children 时,该列表运行良好,但如果该组没有 children,则应用程序崩溃。
此外,我正在做的事情如下所示。
public void getCartData(){
cartProgress.setVisibility(View.VISIBLE);
listDataHeader = new ArrayList<>();
ListChild = new ArrayList<>();
DatabaseReference query = mDatabase;
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//child is each element in the finished list
td = (HashMap<String, Object>) dataSnapshot.getValue();
if(td!=null) {
values = td.values();
String string = values.toString();
JSONArray jsonArray = null;
try {
jsonArray = new JSONArray(values);
for (int a = 0; a < jsonArray.length(); a++) {
JSONObject allJsonObject = jsonArray.getJSONObject(a);
CartFragParentModel cartFragParentModel = new CartFragParentModel();
cartFragParentModel.setItem_name(allJsonObject.optString("mName"));
cartFragParentModel.setItem_price(allJsonObject.optString("mPrice"));
mQuantity = allJsonObject.optString("mQuantity");
cartFragParentModel.setItem_quantity(allJsonObject.optString("mQuantity"));
cartFragParentModel.setItem_symbol(allJsonObject.optString("mCurrency"));
listDataHeader.add(cartFragParentModel);
listChildData = new ArrayList<>();
if (!allJsonObject.has("extraItem")) {
cartProgress.setVisibility(View.GONE);
}
else {
JSONArray extraItemArray = allJsonObject.getJSONArray("extraItem");
for (int b = 0; b < extraItemArray.length(); b++) {
JSONObject jsonObject = extraItemArray.getJSONObject(b);
CartFragChildModel cartFragChildModel = new CartFragChildModel();
cartFragChildModel.setQuantity(allJsonObject.optString("mQuantity"));
cartFragChildModel.setSymbol(allJsonObject.optString("mCurrency"));
cartFragChildModel.setName(jsonObject.optString("menu_extra_item_name"));
cartFragChildModel.setPrice(jsonObject.optString("menu_extra_item_price"));
listChildData.add(cartFragChildModel);
}
ListChild.add(listChildData);
}
cartFragExpandable = new CartFragExpandable(getContext(), listDataHeader, ListChild);
selected_item_list.setAdapter(cartFragExpandable);
cartProgress.setVisibility(View.GONE);
int itemCount = cartFragExpandable.getGroupCount();
for(int i=0; i < cartFragExpandable.getGroupCount(); i++)
try {
selected_item_list.expandGroup(i);
}catch (IndexOutOfBoundsException e){
e.getCause();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
else {
cartProgress.setVisibility(View.GONE);
no_cart_div.setVisibility(View.VISIBLE);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
另外,我得到自定义适配器的异常
ublic class CartFragExpandable extends BaseExpandableListAdapter {
Context context;
ArrayList<CartFragParentModel> ListTerbaru;
ArrayList<ArrayList<CartFragChildModel>> ListChildTerbaru;
public CartFragExpandable (Context context, ArrayList<CartFragParentModel>ListTerbaru, ArrayList<ArrayList<CartFragChildModel>> ListChildTerbaru){
this.context=context;
this.ListTerbaru=ListTerbaru;
this.ListChildTerbaru=ListChildTerbaru;
}
@Override
public boolean areAllItemsEnabled()
{
return true;
}
@Override
public CartFragChildModel getChild(int groupPosition, int childPosition) {
return ListChildTerbaru.get(groupPosition).get(childPosition);
}
@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 CartFragChildModel childTerbaru = getChild(groupPosition, childPosition);
CartFragExpandable.ViewHolder holder= null;
notifyDataSetChanged();
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.row_item_cart_child, null);
holder=new CartFragExpandable.ViewHolder();
holder.item_detail_tv = (TextView)convertView.findViewById(R.id.item_detail_tv);
convertView.setTag(holder);
}
else{
holder=(CartFragExpandable.ViewHolder)convertView.getTag();
}
String quantity = childTerbaru.getQuantity();
String name = childTerbaru.getName();
String price = childTerbaru.getPrice();
String symbol = childTerbaru.getSymbol();
holder.item_detail_tv.setText(quantity+"x "+name+" + "+symbol+price);
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
return ListChildTerbaru.get(groupPosition).size();
}
@Override
public CartFragParentModel getGroup(int groupPosition) {
return ListTerbaru.get(groupPosition);
}
@Override
public int getGroupCount() {
return ListTerbaru.size();
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
CartFragParentModel terbaruModel = (CartFragParentModel) getGroup(groupPosition);
CartFragExpandable.ViewHolder holder= null;
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.row_item_cart_parent, null);
/* ExpandableListView mExpandableListView = (ExpandableListView) parent;
mExpandableListView.expandGroup(groupPosition);*/
holder=new CartFragExpandable.ViewHolder();
holder.name_tv=(TextView)convertView.findViewById(R.id.name_tv);
holder.price_tv = (TextView)convertView.findViewById(R.id.price_tv);
convertView.setTag(holder);
}
else{
holder=(CartFragExpandable.ViewHolder)convertView.getTag();
}
String quantity = terbaruModel.getItem_quantity();
String name = terbaruModel.getItem_name();
String price = terbaruModel.getItem_price();
String symbol = terbaruModel.getItem_symbol();
holder.name_tv.setText(name+" x"+quantity);
holder.price_tv.setText(symbol+price);
return convertView;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public boolean isChildSelectable(int arg0, int arg1) {
return true;
}
static class ViewHolder{
TextView name_tv,price_tv,item_detail_tv;
}
}
请给我建议解决方案,非常感谢。
这会有所帮助。
对于空 child 更新 child 空列表不为空。将此行添加到 Activity class:
if (!allJsonObject.has("extraItem")) {
cartProgress.setVisibility(View.GONE);
ListChild.add(listChildData);
}
然后returnchild数
@Override
public int getChildrenCount(int groupPosition) {
return ListChildTerbaru.get(groupPosition).size();
}
在 return child 计数时试试这个。
希望你们一切都好。好吧,我在一个小问题上浪费了将近 2 天(48 小时)。我正在与 expandablelistview
一起工作,我列表的一些组有 children,其余为空没有 children。当列表有 children 时,该列表运行良好,但如果该组没有 children,则应用程序崩溃。
此外,我正在做的事情如下所示。
public void getCartData(){
cartProgress.setVisibility(View.VISIBLE);
listDataHeader = new ArrayList<>();
ListChild = new ArrayList<>();
DatabaseReference query = mDatabase;
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//child is each element in the finished list
td = (HashMap<String, Object>) dataSnapshot.getValue();
if(td!=null) {
values = td.values();
String string = values.toString();
JSONArray jsonArray = null;
try {
jsonArray = new JSONArray(values);
for (int a = 0; a < jsonArray.length(); a++) {
JSONObject allJsonObject = jsonArray.getJSONObject(a);
CartFragParentModel cartFragParentModel = new CartFragParentModel();
cartFragParentModel.setItem_name(allJsonObject.optString("mName"));
cartFragParentModel.setItem_price(allJsonObject.optString("mPrice"));
mQuantity = allJsonObject.optString("mQuantity");
cartFragParentModel.setItem_quantity(allJsonObject.optString("mQuantity"));
cartFragParentModel.setItem_symbol(allJsonObject.optString("mCurrency"));
listDataHeader.add(cartFragParentModel);
listChildData = new ArrayList<>();
if (!allJsonObject.has("extraItem")) {
cartProgress.setVisibility(View.GONE);
}
else {
JSONArray extraItemArray = allJsonObject.getJSONArray("extraItem");
for (int b = 0; b < extraItemArray.length(); b++) {
JSONObject jsonObject = extraItemArray.getJSONObject(b);
CartFragChildModel cartFragChildModel = new CartFragChildModel();
cartFragChildModel.setQuantity(allJsonObject.optString("mQuantity"));
cartFragChildModel.setSymbol(allJsonObject.optString("mCurrency"));
cartFragChildModel.setName(jsonObject.optString("menu_extra_item_name"));
cartFragChildModel.setPrice(jsonObject.optString("menu_extra_item_price"));
listChildData.add(cartFragChildModel);
}
ListChild.add(listChildData);
}
cartFragExpandable = new CartFragExpandable(getContext(), listDataHeader, ListChild);
selected_item_list.setAdapter(cartFragExpandable);
cartProgress.setVisibility(View.GONE);
int itemCount = cartFragExpandable.getGroupCount();
for(int i=0; i < cartFragExpandable.getGroupCount(); i++)
try {
selected_item_list.expandGroup(i);
}catch (IndexOutOfBoundsException e){
e.getCause();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
else {
cartProgress.setVisibility(View.GONE);
no_cart_div.setVisibility(View.VISIBLE);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
另外,我得到自定义适配器的异常
ublic class CartFragExpandable extends BaseExpandableListAdapter {
Context context;
ArrayList<CartFragParentModel> ListTerbaru;
ArrayList<ArrayList<CartFragChildModel>> ListChildTerbaru;
public CartFragExpandable (Context context, ArrayList<CartFragParentModel>ListTerbaru, ArrayList<ArrayList<CartFragChildModel>> ListChildTerbaru){
this.context=context;
this.ListTerbaru=ListTerbaru;
this.ListChildTerbaru=ListChildTerbaru;
}
@Override
public boolean areAllItemsEnabled()
{
return true;
}
@Override
public CartFragChildModel getChild(int groupPosition, int childPosition) {
return ListChildTerbaru.get(groupPosition).get(childPosition);
}
@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 CartFragChildModel childTerbaru = getChild(groupPosition, childPosition);
CartFragExpandable.ViewHolder holder= null;
notifyDataSetChanged();
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.row_item_cart_child, null);
holder=new CartFragExpandable.ViewHolder();
holder.item_detail_tv = (TextView)convertView.findViewById(R.id.item_detail_tv);
convertView.setTag(holder);
}
else{
holder=(CartFragExpandable.ViewHolder)convertView.getTag();
}
String quantity = childTerbaru.getQuantity();
String name = childTerbaru.getName();
String price = childTerbaru.getPrice();
String symbol = childTerbaru.getSymbol();
holder.item_detail_tv.setText(quantity+"x "+name+" + "+symbol+price);
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
return ListChildTerbaru.get(groupPosition).size();
}
@Override
public CartFragParentModel getGroup(int groupPosition) {
return ListTerbaru.get(groupPosition);
}
@Override
public int getGroupCount() {
return ListTerbaru.size();
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
CartFragParentModel terbaruModel = (CartFragParentModel) getGroup(groupPosition);
CartFragExpandable.ViewHolder holder= null;
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.row_item_cart_parent, null);
/* ExpandableListView mExpandableListView = (ExpandableListView) parent;
mExpandableListView.expandGroup(groupPosition);*/
holder=new CartFragExpandable.ViewHolder();
holder.name_tv=(TextView)convertView.findViewById(R.id.name_tv);
holder.price_tv = (TextView)convertView.findViewById(R.id.price_tv);
convertView.setTag(holder);
}
else{
holder=(CartFragExpandable.ViewHolder)convertView.getTag();
}
String quantity = terbaruModel.getItem_quantity();
String name = terbaruModel.getItem_name();
String price = terbaruModel.getItem_price();
String symbol = terbaruModel.getItem_symbol();
holder.name_tv.setText(name+" x"+quantity);
holder.price_tv.setText(symbol+price);
return convertView;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public boolean isChildSelectable(int arg0, int arg1) {
return true;
}
static class ViewHolder{
TextView name_tv,price_tv,item_detail_tv;
}
}
请给我建议解决方案,非常感谢。
这会有所帮助。
对于空 child 更新 child 空列表不为空。将此行添加到 Activity class:
if (!allJsonObject.has("extraItem")) {
cartProgress.setVisibility(View.GONE);
ListChild.add(listChildData);
}
然后returnchild数
@Override
public int getChildrenCount(int groupPosition) {
return ListChildTerbaru.get(groupPosition).size();
}
在 return child 计数时试试这个。