Адаптер ListView с видом сетки внутри linearlayout, показывающий элементы ниже друг друга вместо двух - PullRequest
0 голосов
/ 06 октября 2018

Я создаю пользовательский адаптер ListView, используя сетку в линейном макете для отображения профилей пользователей.

Мой вид дизайна XML показывает их правильно.Тем не менее, когда я запускаю приложение, оно показывает каждый элемент ниже друг друга, а не распределяется на 2 столбца.Есть идеи, что я делаю не так?

Пример

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <GridView
        android:id="@+id/grid_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="2"
        android:stretchMode="columnWidth"
        android:gravity="center" />

    <ImageView
        android:id="@+id/rimage"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_margin="10dp"
        android:contentDescription="@string/todo"
        app:srcCompat="@drawable/thumb_default_icon_female" />

    <TextView
        android:id="@+id/rnick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:text="@string/nick" />

    <TextView
        android:id="@+id/rcity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:text="@string/city" />
</LinearLayout>

Отображение Элементы списка

Ответы [ 4 ]

0 голосов
/ 06 октября 2018

Используйте Nested LinearLayout вместо gridLayout, также вы, я думаю, забыли поместить представление в gridLayout, поскольку они находятся за пределами gridLayout и дочернего элемента LinearLayout, поэтому они отображаются один под другим.попробуйте код ниже

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal" android:layout_width="fill_parent"
android:layout_height="fill_parent">



<ImageView
    android:id="@+id/rimage"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_margin="10dp"
    android:contentDescription="@string/todo"
    app:srcCompat="@drawable/thumb_default_icon_female" />
<LinearLayout
    android:id="@+id/grid_view"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center" >
<TextView
    android:id="@+id/rnick"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="10dp"
    android:text="@string/nick" />

<TextView
    android:id="@+id/rcity"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginStart="10dp"
    android:text="@string/city" />
 </LinearLayout>
</LinearLayout>
0 голосов
/ 06 октября 2018

Прежде всего вам не следует использовать GridView, а вместо этого RecyclerView , поскольку он заменил функциональность старых ListView и GridView .

Чтобы достичь желаемого, вам нужно создать GridLayoutManager со счетчиком промежутков 2.

RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this, 2);
recyclerView.setLayoutManager(layoutManager);

документация

0 голосов
/ 06 октября 2018

Ваша текущая логика элементов списка выглядит примерно так:

Item 1--> LinearLayout
        -->GridView
        -->ImageView
        -->TextView
        -->TextView

Item 2--> LinearLayout
        -->GridView
        -->ImageView
        -->TextView
        -->TextView

Таким образом, в действительности ваши элементы LinearLayouts занимают всю ширину экрана устройства.

Вместо ListView, вы должны использовать GridView в качестве контейнера ваших элементов, и вы должны реализовать свой customAdapter для использования элементов LinearLayout:

Ваш GridView в макете вашей деятельности:

<GridView
    android:id="@+id/grid_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:numColumns="2"
    android:stretchMode="columnWidth"
    android:gravity="center" />

Расположение ваших товаров:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">

<ImageView
    android:id="@+id/rimage"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_margin="10dp"
    android:contentDescription="@string/todo"
    app:srcCompat="@drawable/thumb_default_icon_female" />

<TextView
    android:id="@+id/rnick"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="10dp"
    android:text="@string/nick" />

<TextView
    android:id="@+id/rcity"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginStart="10dp"
    android:text="@string/city" />

и настройте ваш адаптер на GridView напрямую.Убедитесь, что ваш адаптер расширяет BaseAdapter (не ListAdapter);

yourGridView.setAdapter(yourCustomAdapter);

В целом, лучшим подходом было бы использование RecyclerView с GridLayoutManager.

recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2));
            recyclerView.setHasFixedSize(true);
            recyclerView.setAdapter(adapter);

Вотпростой учебник

0 голосов
/ 06 октября 2018

попробуйте

 gridLayoutManagerVertical =
            new GridLayoutManager(this,
                    2, //The number of Columns in the grid
                    LinearLayoutManager.VERTICAL,
                    false);
...