【问题标题】:getChildView called multiple times using gridview on Android在Android上使用gridview多次调用getChildView
【发布时间】:2015-04-16 22:07:41
【问题描述】:

我有 2 组来自 API 的数据,每组都有 7 个对象,我试图在网格视图中显示这些对象,因此我有一个可扩展的列表视图,其中包含 2 个组,每个组有 7 个对象。问题是,当我运行应用程序时,2 组显示与最后一组相同的数据数组,因此 2 组正在打印第 2 组的相同 7 个对象。运行日志看到多次调用getChildView,我是android开发新手,不知道为什么会这样。有人能帮我吗?

public class ExpandListAdapter extends BaseExpandableListAdapter {

    private Context context;
    private ArrayList<Group> groups;
    private ArrayList<ArrayList<Child>> child = new ArrayList();

    public ExpandListAdapter(Context context, ArrayList<Group> groups) {
        this.context = context;
        this.groups = groups;
        child = new ArrayList();
        for (int i = 0; i < groups.size(); i++) {
            child.add(i, groups.get(i).getItems());
        }
    }


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

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

    @Override
    public View getChildView(int groupPosition, int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {


        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) context
                    .getSystemService(context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.gridview, null);
        }
        CustomGridView gridView = (CustomGridView) convertView
                .findViewById(R.id.GridView_toolbar);

        for (int i = 0; i < groups.size(); i++) {

            ArrayList<String> listchild = new ArrayList<String>();

            for (int j = 0; j < groups.get(i).getItems().size(); j++) {

                listchild.add(child.get(i).get(j).getName());

            }
            gridView.setExpanded(true);
            GridAdapter adapter = new GridAdapter(context, listchild);
            gridView.setAdapter(adapter);// Adapter
        }

        return convertView;

    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return 1;
    }

    @Override
    public Object getGroup(int groupPosition) {
        return groups.get(groupPosition);
    }

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

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

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        Group group = (Group) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater inf = (LayoutInflater) context
                    .getSystemService(context.LAYOUT_INFLATER_SERVICE);
            convertView = inf.inflate(R.layout.group_item, null);
        }
        TextView tv = (TextView) convertView.findViewById(R.id.group_name);
        tv.setText(group.getName());
        return convertView;
    }

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

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

}

【问题讨论】:

    标签: android expandablelistview android-gridview expandablelistadapter


    【解决方案1】:

    getChildView 将根据每个组的项目数被调用 有。因此,如果您的组的大小为 2,并且每组组有 7 个项目,那么总共应该有 14 个调用。您的 getChildrenCount 函数应如下所示:

    public int getChildrenCount(int nGroup)
    {
      return groups.get(nGroup).size();
    }
    

    您的 getChildView 还应该检查当前正在处理哪个组 int groupPosition。

    喜欢

      public View getChildView(int groupPosition, int nChild, boolean isLastChild, View convertView, ViewGroup parent)
      {
        try
        {
          if (groupPosition == 0)
          {
            ...
            ... your code here
          }
        }
        ...
      }
    

    【讨论】:

    • 它将根据您拥有的子视图数量进行调用。所以,如果你有 10 个子视图,代码会被调用 10 次。
    • 使 getChildrenCount 返回 1。
    【解决方案2】:

    这就是我所需要的,这样我就可以从各自的组中获取所有项目:

      @Override
        public View getChildView(int groupPosition, int childPosition,
                                 boolean isLastChild, View convertView, ViewGroup parent) {
    
    
            if (convertView == null) {
                LayoutInflater infalInflater = (LayoutInflater) context
                        .getSystemService(context.LAYOUT_INFLATER_SERVICE);
                convertView = infalInflater.inflate(R.layout.gridview, null);
            }
            CustomGridView gridView = (CustomGridView) convertView
                    .findViewById(R.id.GridView_toolbar);
    
    
                listchild = new ArrayList<Child>();
    
                for(int j = 0; j< groups.get(groupPosition).getItems().size(); j++) {
    
                    listchild.add(child.get(groupPosition).get(j));
    
                }
    
                gridView.setExpanded(true);
                GridAdapter adapter = new GridAdapter(context, listchild);
                gridView.setAdapter(adapter);// Adapter
    
    
            return convertView;
    
        }
                gridView.setExpanded(true);
                GridAdapter adapter = new GridAdapter(context, listchild);
                gridView.setAdapter(adapter);// Adapter
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多