Быстрый вопрос:
В ListView
Я использую этот код:
list.addHeaderView(headerView);
Как справиться с этим при работе над gridview
?
Спасибо.
Быстрый вопрос:
В ListView
Я использую этот код:
list.addHeaderView(headerView);
Как справиться с этим при работе над gridview
?
Спасибо.
Нет поддержки заголовков или нижних колонтитулов с GridView
, извините.
Существует довольно хорошая реализация 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 создает поддельную строку, увеличивая количество элементов по количеству столбцов, а затем возвращает представление заголовка для элемента.
Вы можете использовать это. Нижний колонтитул появляется/скрывается в нижней части сетки, когда вы достигаете/оставляете последнее количество элементов. На самом деле это не прокрутка, но я почти не замечаю разницы.
В вашей активности/фрагменте 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>
Пример кода:
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'
Вам нужно будет использовать ListView, а затем сделать каждую строку списка похожим на строку сетки. Поэтому, если у вас есть сетка из 3 столбцов, вы создадите макет для ListView, который выглядит как 3 столбца. Затем вам придется изменить некоторые аспекты адаптера, чтобы заставить его работать, чтобы каждая строка ListView фактически представляла 3 строки данных - так что вы знаете, getCount()/3 типа.
Как насчет проверки элемента индекса "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
Не проверял, но должен работать.
Вы можете использовать AsymmetricGridView и указать верхние и нижние колонтитулы с большим числом строк, чтобы они взяли всю строку.
Почему бы вам не изменить внешний вид ячеек для первых строк? если вы знаете, сколько столбцов у вас есть, вы знаете, сколько элементов появится в заголовке = количество столбцов. Это работает для меня.
Вы можете использовать эту библиотеку, http://tonicartos.github.io/StickyGridHeaders/
который позволяет создавать заголовки, которые являются липкими (для группировки списка и сохранения видимого заголовка для текущей группы). Вы также можете отключить липкую функцию.
Существует способ выполнить желаемую функциональность БЕЗ использования библиотеки или чего-либо еще.
EDIT: просто заимствуйте реализацию HeaderGridView Google, см. здесь
Вы также можете настроить его для нижнего колонтитула. Предлагаемое ниже предложение слишком сложное и требует большей настройки.
Не вдаваясь в подробности, все, что вам нужно сделать, это это.
1) Подкласс GridView
2) переопределить onScrollChanged
3) Рассчитывать смещение каждый раз, когда он прокручивается
4) Установите родительское представление (представление, которое содержит заголовок и сетку), перевод y в -Offset. (View.setTranslationY(-offset). Также используйте оператор if, который, когда он достигнет определенного смещения, прекратит прокрутку.
5), очевидно, вы хотите структурировать это так, чтобы ваш gridview мог иметь такой метод, как attachToGridview (View view). У меня есть полная реализация этого, который работает.
См. Смещение прокрутки GridView для получения справки о получении смещения, так как GridView имеет ошибку, поскольку просмотры возвращаются.
<?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);
отлично работает, прокрутка для работы сетки также.