2015-05-31 21 views
8

Ho un expandableListView ed ho provato a cambiare i suoi bambino così:getChildView Android non è stato chiamato dopo notifyDataSetChanged

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

Qui è la mia classe di adattatori:

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; 
    } 
} 
} 
metodo

notifyDataSetChanged() non è funziona correttamente, a volte getChildView viene chiamato a volte no, per favore aiutatemi a risolvere questo problema.

+0

Essa può aiutare! http://stackoverflow.com/questions/9260409/updating-expandablelistview-with-notifydatasetchanged e http://stackoverflow.com/questions/22405188/notifydatasetchanged-not-refreshing-expandable-list-view uno dei workaround è solo crollo ed espandi il tuo elemento di visualizzazione elenco espandibile che non sarà visibile all'utente. –

+0

Nessuno dei due potrebbe aiutarmi: (((( – nAkhmedov

+0

Hai provato/fatto qualsiasi debug per conto tuo? Non siamo sensitivi ... – Simas

risposta

5

Si sta modificando il valore sull'elemento figlio, ma non si sta ripristinando l'interno dell'adattatore.

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

aggiungere questo adattatore

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

public void setChild (int groupPosition, int childPosition, item SubItem) { subItems.get (groupPosition) .get (childPosition) .setCount (item.getCount()); } – nAkhmedov

+0

Ho provato ad implementare il metodo setChild() nell'adattatore come sopra ma non aiuta: ((( – nAkhmedov