【问题标题】:GridView inside Expandable list in androidGridView在android中的可扩展列表中
【发布时间】:2011-08-08 20:15:57
【问题描述】:

我想在可扩展列表中放置一个带有图像的 gridview...我已经做到了,但是 gridview 不显示所有项目...

如何使我的可扩展列表子项适应 gridview 大小?

列表适配器

public class CustomListAdapter extends BaseExpandableListAdapter
{
    String[]            catg    = { "Administração, Escritorio e Industria", "Cultura e Entretenimento", "Educação e Crianças", "Eventos e Estado do tempo", "Amigos, Familia e Habitações", "Multimédia", "Diversos", "Números e Letras", "Restaurantes e Hoteis", "Desporto, Saude e Beleza", "Lojas", "Turismo e Natureza", "Transportes" };

    Context             myctx;


    @Override
    public Object getChild(int groupPosition, int childPosition)
    {
        // TODO Auto-generated method stub
        return null;
    }

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

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)
    {
        ViewGroup item = getViewGroupChild(convertView, parent);
        GridView label = (GridView) item.findViewById(ipvc.estg.placebook.R.id.gridview);
        label.setAdapter(new GridAdapter(parent.getContext(), groupPosition+1));
        return item;
    }

    private ViewGroup getViewGroupChild(View convertView, ViewGroup parent)
    {
        // The parent will be our ListView from the ListActivity
        if (convertView instanceof ViewGroup)
        {
            return (ViewGroup) convertView;
        }
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);
        ViewGroup item = (ViewGroup) inflater.inflate(ipvc.estg.placebook.R.layout.expandable_list_row, null);
        return item;
    }

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

    @Override
    public Object getGroup(int groupPosition)
    {
        return catg[groupPosition];
    }

    @Override
    public int getGroupCount()
    {
        return catg.length;
    }

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



    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)
    {
        View item = getViewGroupGroup(convertView, parent);

        TextView text = (TextView) item.findViewById(android.R.id.text1);
        text.setText(catg[groupPosition]);
        return item;
    }

    private View getViewGroupGroup(View convertView, ViewGroup parent)
    {
        // The parent will be our ListView from the ListActivity
        if (convertView instanceof View)
        {
            return (View) convertView;
        }
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);
        View item1 = (View) inflater.inflate(android.R.layout.simple_expandable_list_item_1, null);

        return item1;
    }

    @Override
    public boolean hasStableIds()
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition)
    {
        // TODO Auto-generated method stub
        return true;
    }

}

列表行布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/linearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <GridView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/gridview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:columnWidth="50dp"
        android:numColumns="auto_fit"
        android:verticalSpacing="10dp"
        android:horizontalSpacing="10dp"
        android:stretchMode="columnWidth"
        android:gravity="center" />
</LinearLayout>

【问题讨论】:

  • 你能展示一下GridAdapter吗?因为我已经在导航抽屉内实现了可扩展列表视图,并且我想在可扩展列表视图子视图中添加包含图像的网格视图。
  • 嘿,你能分享完整的编码吗?

标签: android gridview view adapter expandablelistview


【解决方案1】:

试试这个带有gridview的可消耗列表视图的github完整源代码

https://github.com/coolwd10/ExpandablelistwithGirdview

【讨论】:

    【解决方案2】:

    您需要做的就是使用 ExpandableHeightGridView 更改 GridView

    并使用

    配置 XML
    android:isScrollContainer="false"
    

    在代码中

    expandableHeightGridView.setExpanded(true);
    

    【讨论】:

    • 您的解决方案有效。我认为这是最容易解决这个问题的方法。谢谢
    【解决方案3】:

    使用 Gallery 代替 GridView 怎么样? 签出this

    【讨论】:

    • 请注意,从 API 级别 16(果冻豆)开始,Gallery 已被弃用。
    【解决方案4】:

    我自己进行了大量搜索以解决这种情况,但到目前为止没有找到任何东西,所以我做了一个解决方法。

    此解决方法假定您知道/可以检索列的宽度和网格单元渲染器的高度(布局 xml 中设置的 dp 大小)。

    您应该在ExpandableListAdaptergetChildView 方法中再插入几行:

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)
    {
        ViewGroup item = getViewGroupChild(convertView, parent);
        GridView label = (GridView) item.findViewById(ipvc.estg.placebook.R.id.gridview);
        label.setAdapter(new GridAdapter(parent.getContext(), groupPosition+1));
    
        // initialize the following variables (i've done it based on your layout
        // note: rowHeightDp is based on my grid_cell.xml, that is the height i've
        //    assigned to the items in the grid.
        final int spacingDp = 10;
        final int colWidthDp = 50;
        final int rowHeightDp = 20;
    
        // convert the dp values to pixels
        final float COL_WIDTH = getBaseContext().getResources().getDisplayMetrics().density * colWidthDp;
        final float ROW_HEIGHT = getBaseContext().getResources().getDisplayMetrics().density * rowHeightDp;
        final float SPACING = getBaseContext().getResources().getDisplayMetrics().density * spacingDp;
    
        // calculate the column and row counts based on your display
        final int colCount = (int)Math.floor((parentView.getWidth() - (2 * SPACING)) / (COL_WIDTH + SPACING));
        final int rowCount = (int)Math.ceil((intValues.size() + 0d) / colCount);
    
        // calculate the height for the current grid
        final int GRID_HEIGHT = Math.round(rowCount * (ROW_HEIGHT + SPACING));
    
        // set the height of the current grid
        label.getLayoutParams().height = GRID_HEIGHT;
    
        return item;
    }
    

    通过上面的添加,我能够生成以下显示的布局:

    希望对你也有帮助。

    【讨论】:

    • 不客气,祝您编码愉快! ;) 也为原版 +1。问题,让我们希望其他人也会发现它有用
    • @rekaszeru 你能告诉我parentViewintValues 代表什么吗?提前致谢
    • @Anuja Piyadigama:parentView 是一个视图(可选包含网格),可以确定谁的宽度,并匹配网格的宽度。如果你有固定的网格宽度,你可以在那里使用它。 intValues 是输入网格的整数列表。根据这些整数的数量,并知道列数,您可以计算出需要多少行。希望这能澄清一些事情。
    • @rekaszeru 感谢您的回复。我在一个 XML 文件中的 LinearLayout 中有 ExpandableListView,而在另一个 XML 文件中的另一个 LinearLayout 中有 GridView。那么我需要将LinearLayout 作为我的 parentView 还是您在说单个 Grid ?我正在从一个单独的 JSON 中提供网格内容,它可以在其中增加。那么我该如何计算 intValues 谢谢
    • @Anuja Piyadigama,你看看parent 参数是否对你有用(据我了解,它指的是你正在寻找的LinearLayout,所以不要使用parentView您可以使用parent 参数的宽度);从intValues 开始,此列表的长度变化并不重要,为ExpandableListView 提供适当的BaseAdapter 扩展名,您可以在必要时调用它notifyDatasetChanged(),所以您可以随意计算 JSON 列表中的项目,并用它计算。
    猜你喜欢
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多