Android: Как GridView auto_fit находит количество столбцов?
Я хотел бы лучше понять, как работает Gridview
, в частности auto_fit
. Вот XML-макет:
И он отлично работает с серией из шести эскизов (48 * 48 пикселей). В портретном режиме он отображает одну строку, шесть столбцов.
- Выключить автозапуск для EditText?
- android youtube загружает видео со статическим именем пользователя и паролем
- Отображать fragment просмотра в fragmentе
- ArrayIndexOutOfBoundsException с пользовательским адаптером Android для нескольких видов в ListView
- как реализовать фильтрацию в RealmRecyclerViewAdapter
Я не понимаю, почему android:columnWidth="60dp"
строка android:columnWidth="60dp"
, так как ожидается, что auto_fit найдет нужное количество столбцов.
Без линии android:columnWidth="60dp"
, он отображает сетку 3 строки и 2 столбца.
Вот class ImageAdapter
:
package com.examples.HelloGridView; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; public class ImageAdapter extends BaseAdapter { private Context mContext; public ImageAdapter(Context c) { mContext = c; } public int getCount() { return mThumbIds.length; } public Object getItem(int position) { return null; } public long getItemId(int position) { return 0; } // create a new ImageView for each item referenced by the Adapter public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { // if it's not recycled, initialize some attributes imageView = new ImageView(mContext); imageView.setPadding(0, 0, 0, 0); } else { imageView = (ImageView) convertView; } imageView.setImageResource(mThumbIds[position]); return imageView; } // references to our images private Integer[] mThumbIds = { R.drawable.ic_1, R.drawable.ic_2, R.drawable.ic_3, R.drawable.ic_4, R.drawable.ic_5, R.drawable.ic_6 }; }
Спасибо за помощь.
- API-ключ для GCM неожиданно недействителен? Несанкционированная ошибка (401)
- Волейбол не вызывает getParams () для стандартного запроса POST
- Получение видимых элементов в RecyclerView
- Как я могу запустить программный экран приложений Android?
- Лучшая практика для вложенных fragmentов в Android 4.0, 4.1 (<4.2) без использования библиотеки поддержки
- Измерение высоты текста на Canvas (Android)
- Использование типов сборки в Gradle для запуска того же приложения, которое использует ContentProvider на одном устройстве
- Как распечатать stacktrace для исключения Android
Глядя на источник GridView, ясно, что настройка отступов и высоты на вашем ImageView не поможет вам вообще. Когда ширина столбца не указана, он просто выбирает заданное количество столбцов (2):
private void determineColumns(int availableSpace) { ... if (mRequestedNumColumns == AUTO_FIT) { if (requestedColumnWidth > 0) { // Client told us to pick the number of columns mNumColumns = (availableSpace + requestedHorizontalSpacing) / (requestedColumnWidth + requestedHorizontalSpacing); } else { // Just make up a number if we don't have enough info mNumColumns = 2; } } else { // We picked the columns mNumColumns = mRequestedNumColumns; } if (mNumColumns <= 0) { mNumColumns = 1; } ...
Решение состоит в том, чтобы измерять размер столбца, прежде чем устанавливать ширину столбца GridView. Вот быстрый способ измерения Views offscreen:
public int measureCellWidth( Context context, View cell ) { // We need a fake parent FrameLayout buffer = new FrameLayout( context ); android.widget.AbsListView.LayoutParams layoutParams = new android.widget.AbsListView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); buffer.addView( cell, layoutParams); cell.forceLayout(); cell.measure(1000, 1000); int width = cell.getMeasuredWidth(); buffer.removeAllViews(); return width; }
И тогда вы просто установите ширину столбца GridView:
gridView.setColumnWidth( width );
Согласно документации android: numColumns
auto_fit
Отображает как можно больше столбцов, чтобы заполнить доступное пространство.
Поэтому, если вы вставляете ImageView
с
padding
установлено на zero
margin
zero
layout_width
установлен в wrap_content
layout_height
установлен на wrap_content
В gridView должно быть максимально возможное количество детей
Имейте в виду, что ваши ImageViews могут масштабироваться (:
Это может помочь кому-то … Вам нужно найти размер ширины вручную. Основываясь на размере ширины, вы можете установить столбец
float scalefactor = getResources().getDisplayMetrics().density * 100; int number = getWindowManager() .getDefaultDisplay().getWidth(); int columns = (int) ((float) number / scalefactor) / 2; if (columns == 0 || columns == 1) columns = 2; gridView.setNumColumns(columns);
Я нахожу, что я обычно знаю, насколько широка я хочу, чтобы мои столбцы были. Либо я знаю размер моих фотографий, либо я позволяю пользователю определять этот размер. Поэтому я могу просто установить ширину в моей Activity:
gridview = (GridView) findViewById(R.id.gridview); SharedPreferences mySettings; mySettings = getSharedPreferences(Constants.PREFERENCES, Context.MODE_PRIVATE); int gridSize = 50 * Integer.parseInt(mySettings.getString("gridSize", "3")); gridview.setColumnWidth(gridSize + 10);
Это все . , ,
Привет из Люцерна, Стефана
«wrap_content» работает как перенос слов для текстовых редакторов – если изображение не может вписаться в последний размер столбца, изображение переходит к следующей строке. Однако, если вы установите атрибут numcolumns на число, тогда grid может растягивать / корректировать столбцы (stretchModde – это еще одно свойство, которое вы можете использовать совместно).
ps – хотя вы отметили ответ, были бы рады узнать, помогло ли это.