2015-05-31 10 views
8

के बाद बुलाया जा रहा है नहीं है मैं एक expandableListView है और इस तरह अपने बच्चे को बदलने की कोशिश:एंड्रॉयड getChildView notifyDataSetChanged

public class DrawerAdapter extends BaseExpandableListAdapter { 

private Context context; 
private List<Item> items; 
private List<List<SubItem>> subItems; 

public DrawerAdapter(Context context, List<Item> items, List<List<SubItem>> subItems) { 
    this.context = context; 
    this.items = items; 
    this.subItems = subItems; 
} 

@Override 
public int getGroupCount() { 
    return items.size(); 
} 

@Override 
public int getChildrenCount(int groupPosition) { 
    return subItems.get(groupPosition).size(); 
} 

@Override 
public Object getGroup(int position) { 
    return items.get(position); 
} 

@Override 
public Object getChild(int groupPosition, int childPosition) { 
    return subItems.get(groupPosition).get(childPosition); 
} 

@Override 
public long getGroupId(int position) { 
    return position; 
} 

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

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

@Override 
public View getGroupView(int groupPosition, boolean isExpanded, View view, ViewGroup viewGroup) { 

    Item item = (Item) getGroup(groupPosition); 

    if (view == null) { 
     LayoutInflater layoutInflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = layoutInflater.inflate(R.layout.list_drawer_group, null); 
    } 

    ImageView iconView = (ImageView) view.findViewById(R.id.icon_view); 
    if (item.iconDrawableId != null) { 
     iconView.setImageResource(item.iconDrawableId); 
     iconView.setVisibility(View.VISIBLE); 
    } else { 
     iconView.setVisibility(View.GONE); 
    } 

    TextView groupHeader = (TextView) view.findViewById(R.id.group_header); 
    groupHeader.setText(item.title); 
    if (item.iconDrawableId != null) { 
     groupHeader.setPadding(
      DimensionHelper.dpToPixels(context, 4.0f), 0, 
      DimensionHelper.dpToPixels(context, 16.0f), 0); 
    } else { 
     groupHeader.setPadding(
      DimensionHelper.dpToPixels(context, 16.0f), 0, 
      DimensionHelper.dpToPixels(context, 16.0f), 0); 
    } 

    ImageView imageView = (ImageView) view.findViewById(R.id.image_view); 
    imageView.setImageResource(isExpanded ? R.drawable.ic_navigation_collapse : R.drawable.ic_navigation_expand); 
    imageView.setVisibility(getChildrenCount(groupPosition) > 0 ? View.VISIBLE : View.GONE); 

    return view; 
} 

@Override 
public View getChildView(int groupPosition, int childPosition, boolean isExpanded, View view, ViewGroup viewGroup) { 

    SubItem subItem = (SubItem) getChild(groupPosition, childPosition); 

    if (view == null) { 
     LayoutInflater layoutInflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = layoutInflater.inflate(R.layout.list_drawer_item, null); 
    } 

    TextView colorPreView = (TextView) view.findViewById(R.id.colorPreView); 
    if (subItem.getColor() != -1) { 
     colorPreView.setBackgroundColor(subItem.getColor()); 
     colorPreView.setVisibility(View.VISIBLE); 
    } else { 
     colorPreView.setVisibility(View.GONE); 
    } 

    ImageView iconView = (ImageView) view.findViewById(R.id.icon_view); 
    if (subItem.iconDrawableId != null) { 
     iconView.setImageResource(subItem.iconDrawableId); 
     iconView.setVisibility(View.VISIBLE); 
    } else { 
     iconView.setVisibility(View.GONE); 
    } 

    TextView title = (TextView) view.findViewById(R.id.title_text_view); 
    title.setText(subItem.title); 

    if (subItem.iconDrawableId != null) { 
     title.setPadding(
       DimensionHelper.dpToPixels(context, 4.0f), 0, 
       DimensionHelper.dpToPixels(context, 16.0f), 0); 
    } else { 
     title.setPadding(
       DimensionHelper.dpToPixels(context, 40.0f), 0, 
       DimensionHelper.dpToPixels(context, 16.0f), 0); 
    } 

    TextView counter = (TextView) view.findViewById(R.id.counter_text_view); 
    counter.setText(String.valueOf(subItem.count)); 
    counter.setVisibility(subItem.count > 0 ? View.VISIBLE : View.GONE); 

    return view; 
} 

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

public static class Item { 

    protected String title; 
    protected Integer iconDrawableId; 
    protected Listener listener; 

    public Item(String title, Integer iconDrawableId, Listener listener) { 
     this.title = title; 
     this.iconDrawableId = iconDrawableId; 
     this.listener = listener; 
    } 

    public Listener getListener() { 
     return listener; 
    } 

    public static interface Listener { 
     public void onClick(FragmentManager fragmentManager); 
    } 
} 

public static class SubItem extends Item { 

    protected long count; 
    protected int color; 

    public SubItem(String title, Integer iconDrawableId, long count, int color, Listener listener) { 
     super(title, iconDrawableId, listener); 
     this.count = count; 
     this.color = color; 
    } 

    public long getCount() { 
     return count; 
    } 

    public void setCount(long count) { 
     this.count = count; 
    } 

    public int getColor() { 
     return color; 
    } 

    public void setColor(int color) { 
     this.color = color; 
    } 
} 
} 

notifyDataSetChanged() विधि नहीं है:

((SubItem) adapter.getChild(i+1, 5)).setCount(unreadBox); 
adapter.notifyDataSetChanged(); 

यहाँ मेरी एडाप्टर वर्ग है ठीक से काम करना, कभी-कभी getChildView को कभी-कभी नहीं कहा जा रहा है, कृपया इस समस्या को ठीक करने के लिए सहायता करें।

+0

में इस ऐड यह आपकी मदद कर सकता है! http://stackoverflow.com/questions/9260409/updating-expandablelistview-with-notifydatasetchanged और http://stackoverflow.com/questions/22405188/notifydatasetchanged-not-refreshing-expandable-list-view वर्कअराउंड में से एक केवल पतन है और अपनी विस्तारणीय सूची दृश्य आइटम का विस्तार करें जो उपयोगकर्ता को दिखाई नहीं देगा। –

+0

उनमें से कोई भी मेरी मदद नहीं कर सका: ((( – nAkhmedov

+0

क्या आपने अपनी खुद की कोई डिबगिंग करने की कोशिश की है? हम मनोविज्ञान नहीं हैं ... – Simas

उत्तर

5

आप बच्चे के आइटम में मूल्य बदल रहे हैं हालांकि एडाप्टर के अंदर वापस सेट नहीं कर रहे हैं।

SubItem item = ((SubItem) adapter.getChild(i+1, 5)).setCount(unreadBox); 
adapter.setChild(i+1,5,item); 
adapter.notifyDataSetChanged(); 

एडाप्टर

@Override 
public void setChild(int groupPosition, int childPosition,SubItem item) { 
    subItems.get(groupPosition).get(childPosition) = item; 
} 
+0

सार्वजनिक शून्य सेटChild (int groupPosition, int childPosition, SubItem आइटम) { subItems.get (groupPosition) .get (childPosition) .setCount (item.getCount()); } – nAkhmedov

+0

मैंने उपरोक्त के रूप में एडाप्टर में setChild() विधि को लागू करने का प्रयास किया लेकिन यह मदद नहीं करता है: ((( – nAkhmedov