Подтвердить что ты не робот

Может ли GridView иметь нижний колонтитул и заголовок, как и ListView?

Быстрый вопрос:

В ListView Я использую этот код:

list.addHeaderView(headerView);

Как справиться с этим при работе над gridview?

Спасибо.

4b9b3361

Ответ 1

Нет поддержки заголовков или нижних колонтитулов с GridView, извините.

Ответ 2

Существует довольно хорошая реализация GridView с поддержкой заголовков в приложении "Google Фото", поскольку код OSS вы можете использовать его как есть или считать его ссылкой для своей собственной реализации: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/4.3_r2.1/com/android/photos/views/HeaderGridView.java

Основная идея довольно проста - WrapperAdapter создает поддельную строку, увеличивая количество элементов по количеству столбцов, а затем возвращает представление заголовка для элемента.

Ответ 3

Вы можете использовать это. Нижний колонтитул появляется/скрывается в нижней части сетки, когда вы достигаете/оставляете последнее количество элементов. На самом деле это не прокрутка, но я почти не замечаю разницы.

В вашей активности/фрагменте onCreate/onCreateView вы добавляете OnScrollListener в GridView:

    ....
    GridView gridview = (YMAnimatedGridview) v.findViewById(R.id.my_gridview);
    gridview.setAdapter(adapter);
    final View footerView = mainView
            .findViewById(R.id.my_grid_footer_view);
    gridview.setOnScrollListener(new GridView.OnScrollListener() {

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {

                if (firstVisibleItem + visibleItemCount == totalItemCount) {

                    // last item in grid is on the screen, show footer:
                    footerView.setVisibility(View.VISIBLE);

                } else if (footerView.getVisibility() != View.GONE) {

                    // last item in grid not on the screen, hide footer:
                    footerView.setVisibility(View.GONE);
                }
            }

        @Override
        public void onScrollStateChanged(AbsListView view,
                int scrollState) {
        }
    });

Ваш макет должен выглядеть примерно так: Обратите внимание на параметр layout_weight (и layout_height) в gridview, необходимо сделать правильное пространство для нижнего колонтитула, когда оно станет видимым.

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <GridView
        android:id="@+id/my_gridview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:columnWidth="160dp"
        android:gravity="center_horizontal"
        android:horizontalSpacing="12dp"
        android:numColumns="auto_fit"
        android:layout_weight="1"
        android:stretchMode="columnWidth"
        android:verticalSpacing="6dp" />

    <TextView
        android:id="@+id/my_grid_footer_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:layout_marginBottom="8dp"
        android:orientation="horizontal"
        android:visibility="gone"
        android:text="footer text here" >
    </TextView>
</LinearLayout>

Ответ 4

введите описание изображения здесь

Пример кода:

GridViewWithHeaderAndFooter gridView = (GridViewWithHeaderAndFooter) v.findViewById(R.id.ly_image_list_grid);

LayoutInflater layoutInflater = LayoutInflater.from(this);
View headerView = layoutInflater.inflate(R.layout.test_header_view, null);
View footerView = layoutInflater.inflate(R.layout.test_footer_view, null);
gridView.addHeaderView(headerView);
gridView.addFooterView(footerView);

Gradle build: .

compile 'in.srain.cube:grid-view-with-header-footer:1.0.12'

Ответ 5

Вам нужно будет использовать ListView, а затем сделать каждую строку списка похожим на строку сетки. Поэтому, если у вас есть сетка из 3 столбцов, вы создадите макет для ListView, который выглядит как 3 столбца. Затем вам придется изменить некоторые аспекты адаптера, чтобы заставить его работать, чтобы каждая строка ListView фактически представляла 3 строки данных - так что вы знаете, getCount()/3 типа.

Ответ 6

Как насчет проверки элемента индекса "0" в вашем адаптере? Вы можете раздуть пользовательский вид для первого.

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
            if(view==null){
                 if(position==0){
                      //  ...inflate header view
                 }else{
                      //  ...do as usual

Не проверял, но должен работать.

Ответ 7

Вы можете использовать AsymmetricGridView и указать верхние и нижние колонтитулы с большим числом строк, чтобы они взяли всю строку.

Ответ 8

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

Ответ 9

Вы можете использовать эту библиотеку, http://tonicartos.github.io/StickyGridHeaders/

который позволяет создавать заголовки, которые являются липкими (для группировки списка и сохранения видимого заголовка для текущей группы). Вы также можете отключить липкую функцию.

Ответ 10

Существует способ выполнить желаемую функциональность БЕЗ использования библиотеки или чего-либо еще.

EDIT: просто заимствуйте реализацию HeaderGridView Google, см. здесь
Вы также можете настроить его для нижнего колонтитула. Предлагаемое ниже предложение слишком сложное и требует большей настройки. Не вдаваясь в подробности, все, что вам нужно сделать, это это.

1) Подкласс GridView
2) переопределить onScrollChanged 3) Рассчитывать смещение каждый раз, когда он прокручивается
4) Установите родительское представление (представление, которое содержит заголовок и сетку), перевод y в -Offset. (View.setTranslationY(-offset). Также используйте оператор if, который, когда он достигнет определенного смещения, прекратит прокрутку. 5), очевидно, вы хотите структурировать это так, чтобы ваш gridview мог иметь такой метод, как attachToGridview (View view). У меня есть полная реализация этого, который работает.
См. Смещение прокрутки GridView для получения справки о получении смещения, так как GridView имеет ошибку, поскольку просмотры возвращаются.

Ответ 11

<?xml version="1.0" encoding="utf-8"?>

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

    <com.test.Breadcrumbs android:layout_width="fill_parent" android:layout_height="100dp" />

    <GridView
            android:id="@+id/grid"
            android:numColumns="auto_fit"
            android:gravity="center"
            android:stretchMode="columnWidth"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:verticalSpacing="10dp"
            android:horizontalSpacing="10dp">
    </GridView>

</LinearLayout>

и Breadcrumbs:

public class Breadcrumbs extends LinearLayout {

    public Breadcrumbs(final Context context, final AttributeSet attrs) {
        super(context, attrs);

        final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        layoutView = inflater.inflate(R.layout.breadcrumbs, this, true);

отлично работает, прокрутка для работы сетки также.