【问题标题】:android getChildView is not being called after notifyDataSetChanged在 notifyDataSetChanged 之后没有调用 android getChildView
【发布时间】:2015-08-13 21:29:19
【问题描述】:

我有一个 expandableListView 并试图改变它的孩子:

((SubItem) adapter.getChild(i+1, 5)).setCount(unreadBox);
 adapter.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() 方法无法正常工作,有时调用 getChildView 有时不调用,请帮助解决此问题。

【问题讨论】:

  • 它可以帮助你! stackoverflow.com/questions/9260409/…stackoverflow.com/questions/22405188/… 解决方法之一就是折叠并展开用户不可见的可展开列表视图项。
  • 他们谁都帮不了我:((((
  • 您自己尝试过/做过任何调试吗?我们不是通灵者……
  • 您能否发布您的完整适配器代码?
  • 当您的 notifydatasetchanged 调用未触发 getchildview() 时,是否有任何可展开列表视图项处于展开模式?如果没有展开组,则 notifydataset 不会触发 getchildview()。但它总是会触发 getGroupView。 At 只会为扩展组调用 getChildView。

标签: android adapter expandablelistview notifydatasetchanged


【解决方案1】:

您正在将值更改为子项,但未设置回适配器内部。

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

【讨论】:

  • public void setChild(int groupPosition, int childPosition,SubItem item) { subItems.get(groupPosition).get(childPosition).setCount(item.getCount()); }
  • 我尝试在上面的适配器中实现 setChild() 方法,但它没有帮助:(((
猜你喜欢
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 2013-03-17
  • 2018-11-29
  • 1970-01-01
相关资源
最近更新 更多