Просмотр сетки внутри расширяемого списка в Android

#android #gridview #view #adapter #expandablelistview

#Android #просмотр сетки #Вид #адаптер #расширяемый список

Вопрос:

Я хочу поместить 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>
  

Комментарии:

1. можете ли вы показать адаптеру сетки? потому что я уже реализую расширяемый listview внутри панели навигации, и я хочу добавить, что gridview содержит изображения внутри расширяемого дочернего элемента listview.

2. Эй, не могли бы вы, пожалуйста, поделиться полным кодом?

Ответ №1:

Я самостоятельно провел множество поисковых запросов для решения этой ситуации, но пока ничего не нашел, поэтому я нашел обходной путь.

Этот обходной путь предполагает, что вы знаете / можете получить ширину ваших столбцов и высоту ваших средств визуализации ячеек сетки (размер dp, установленный в вашем макете xml).

Вам следует вставить еще несколько строк внутри вашего ExpandableListAdapter getChildView метода:

 @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. Добро пожаловать, приятного кодирования дальше! 😉 также 1 для оригинала. вопрос, будем надеяться, что другие тоже найдут это полезным

2. @rekaszeru не могли бы вы, пожалуйста, сказать мне, что означает parentView и intValues ? Заранее спасибо

3. @Anuja Piyadigama: parentView это представление (необязательно содержащее сетку), ширину которого можно определить, и оно соответствует ширине сетки. Если у вас фиксированная ширина сетки, вы можете использовать ее там. intValues — это список целых чисел, которые загружаются в сетку. Основываясь на количестве этих целых чисел и зная количество столбцов, вы можете рассчитать, сколько строк необходимо. Надеюсь, это немного прояснит ситуацию.

4. @rekaszeru спасибо за ответ. У меня есть ExpandableListView in LinearLayout в одном XML-файле, а GridView находится внутри другого LinearLayout в другом XML-файле. Итак, мне нужно получить LinearLayout в качестве моего parentView или вы говорите об одной сетке? Я загружаю содержимое сетки из отдельного JSON, где оно может быть увеличено. Итак, как я могу посчитать внутренние значения , спасибо

5. @Anuja Piyadigama, вы видите, работает ли parent параметр для вас или нет (как я понимаю, он относится к тому, что LinearLayout вы ищете, поэтому вместо использования parentView вы могли бы использовать ширину parent параметра); на данный момент intValues не имеет значения, что длина этого списка меняется, с соответствующим BaseAdapter расширением для ExpandableListView notifyDatasetChanged() вы можете вызывать его, когда это необходимо, так что вы просто можете считать элементы в списке JSON и вычислять с его помощью.

Ответ №2:

все, что вам нужно сделать, это изменить GrideView с помощью ExpandableHeightGridView

и настройте XML с помощью

 android:isScrollContainer="false"
  

и в коде

 expandableHeightGridView.setExpanded(true);
  

Комментарии:

1. Ваше решение работает. Я думаю, что это самый простой способ решить эту проблему. Спасибо

Ответ №3:

как насчет использования галереи вместо просмотра сетки? Зацените это!

Комментарии:

1. Обратите внимание, что Галерея устарела, начиная с 16-го уровня API (Jelly Bean).

Ответ №4:

Попробуйте этот полный исходный код github для просмотра списка расходных материалов с помощью gridview

https://github.com/coolwd10/ExpandablelistwithGirdview