Наложение ActionBar с заполнением GridView или пользовательским GridView для отображения всего первого изображения?

У меня есть активность с GridView внутри него. ActionBar установлен в режим наложения.

Прямо сейчас вы можете видеть только половину первого изображения, потому что ActionBar разрезает его пополам.

Как добавить прописку в интерьер GridView так, чтобы она инициализировалась таким образом, чтобы вы могли видеть все первое изображение? Или есть другой способ? Например, как я могу расширить GridView, чтобы создать тот, который имеет встроенный настраиваемый динамический разрыв спереди?

пример

Пример (хотя ListView вместо GridView): reddit – приложение для развлечения: https://play.google.com/store/apps/details?id=com.andrewshu.android.reddit

Edit: Я скрываю ActionBar всякий раз, когда пользователь прокручивается с определенной скоростью или мимо определенного уровня.

Используйте ViewTreeObserver.OnGlobalLayoutListener в своей деятельности или фрагменте, чтобы определить количество столбцов, отображаемых вашим GridView (предполагая, что оно зависит от размера экрана и ориентации), а затем используйте этот номер в вашей реализации Adapter . В getView() , если position меньше числа столбцов, верните пустое представление, высота которого совпадает с getView() действий, в противном случае свяжите ваши данные, как обычно.

Существует отличный пример, который делает именно то, что вы хотите в образце приложения Google Displaying Bitmaps Efficiently: https://developer.android.com/training/displaying-bitmaps/display-bitmap.html

Вот соответствующий исходный код: https://android.googlesource.com/platform/development/+/master/samples/training/bitmapfun/src/com/example/android/bitmapfun/ui/ImageGridFragment.java

Попробуйте добавить android:layout_marginTop="?android:attr/actionBarSize" к родительскому android:layout_marginTop="?android:attr/actionBarSize" вашего GridView или самому GridView , если у него его нет.

Это подтолкнет ваш макет так, чтобы он находился ниже ActionBar .

редактировать

Вы можете захотеть использовать ListView вместо GridView . Разум, вы можете легко достичь этого эффекта, создав поддельный заголовок, а затем вызвав ListView.addHeaderView . Вы не можете сделать то же самое с GridView . То, о чем вы говорите, может быть сделано с помощью GridView , но вам потребуется подклассифицировать его и немного изменить.

заголовок

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="?android:attr/actionBarSize" /> 

Имея ActionBar в режиме наложения, для меня работает следующее:

 <GridView android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="?android:attr/actionBarSize" android:clipToPadding="false" android:numColumns="auto_fit" android:columnWidth="120dp" android:verticalSpacing="8dp" android:horizontalSpacing="8dp" android:stretchMode="columnWidth" android:gravity="center" android:id="@+id/gridLibrary" /> 

Самые важные строки здесь: android: paddingTop and android: clipToPadding . В моем приложении, когда я открываю действие с помощью gridview выше, первая строка полностью видима. Затем, когда я прокручиваю вниз, ActionBar скрывается, и gridview заполняет весь экран.