Intereting Posts
Можем ли мы изменить изображение ссылки (которое опубликовано приложением Android) на facebook Как я могу разрешить «PlaceAutocompleteFragment»? Как проверить производительность приложения для Android? Как использовать вспышку / светодиод камеры в качестве фонарика на вкладке Samsung Galaxy Tab? Как вернуть индекс в макете? Проблема упорядочивания стека событий при запуске приложения из установщика приложений Android и с главного экрана Android: фон градиента AppBarLayout Когда лучше не использовать Phonegap? Создание мобильной версии веб-сайта Как обновить-обновить фрагмент в ViewPager по основной активности программно Упрощенный и традиционный китайский против регионов Как определить пользовательские атрибуты Android-библиотек и переназначить имена пакетов во время сборки? Как установить сообщение, когда я получаю исключение Как проверить, открыта ли камера любым приложением Повторная настройка RecyclerView StaggeredGridLayoutManager

Изменение количества столбцов с помощью GridLayoutManager и RecyclerView

Внутри моего фрагмента я устанавливаю свой GridLayout следующим образом: mRecycler.setLayoutManager(new GridLayoutManager(rootView.getContext(), 2));

Поэтому я просто хочу изменить это на 4 когда пользователь поворачивает телефон / планшет. Я читал о onConfigurationChanged и я пытался заставить его работать для моего дела, но это не так. Когда я поворачиваю свой телефон, приложение падает …

Не могли бы вы рассказать мне, как решить эту проблему?

Вот мой подход к поиску решения, которое работает неправильно:

  @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); int orientation = newConfig.orientation; if (orientation == Configuration.ORIENTATION_PORTRAIT) { mRecycler.setLayoutManager(new GridLayoutManager(mContext, 2)); } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) { mRecycler.setLayoutManager(new GridLayoutManager(mContext, 4)); } } 

Заранее спасибо!

Solutions Collecting From Web of "Изменение количества столбцов с помощью GridLayoutManager и RecyclerView"

Попробуйте обработать это внутри вашего метода onCreateView, поскольку он будет вызываться каждый раз, когда происходит изменение ориентации:

 if(getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){ mRecycler.setLayoutManager(new GridLayoutManager(mContext, 2)); } else{ mRecycler.setLayoutManager(new GridLayoutManager(mContext, 4)); } 

Если у вас есть несколько условий или используйте значение в нескольких местах, это может быстро выйти из-под контроля. Я предлагаю создать следующую структуру:

 res - values - dimens.xml - values-land - dimens.xml 

С res/values/dimens.xml :

 <?xml version="1.0" encoding="utf-8"?> <resources> <integer name="gallery_columns">2</integer> </resources> 

И res/values-land/dimens.xml :

 <?xml version="1.0" encoding="utf-8"?> <resources> <integer name="gallery_columns">4</integer> </resources> 

И тогда код становится (и навсегда остается) следующим образом:

 final int columns = getResources().getInteger(R.integer.gallery_columns); mRecycler.setLayoutManager(new GridLayoutManager(mContext, columns)); 

Вы можете легко увидеть, как легко добавлять новые способы определения количества столбцов, например, используя -w500dp / -w600dp / -w700dp папки ресурсов вместо -land .

Также довольно легко группировать эти папки в отдельную папку ресурсов, если вы не хотите загромождать свои другие (более релевантные) ресурсы:

 android { sourceSets.main.res.srcDir 'src/main/res-overrides' // add alongside src/main/res } 

Recycle View поддерживает AutofitRecycleView.

Вам нужно добавить android:numColumns="auto_fit" в ваш XML-файл.

Вы можете обратиться к этому AutofitRecycleViewLink

Более надежный способ определить нет. Столбцов будет вычислять его на основе ширины экрана и во время выполнения. Обычно я использую для этого следующую функцию.

 public static int calculateNoOfColumns(Context context) { DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); float dpWidth = displayMetrics.widthPixels / displayMetrics.density; int scalingFactor = 180; int noOfColumns = (int) (dpWidth / scalingFactor); return noOfColumns; } 

Это более динамичный метод, позволяющий точно вычислить значение no. Столбцов. Это будет более адаптировано для пользователей с различными размерами экрана, не ограничиваясь только двумя возможными значениями.

NB: Вы можете изменить значение, удерживаемое переменной scalingFactor . Чем меньше, тем больше нет. Столбцов, которые вы можете отобразить, и чем больше значение, тем меньше нет. Столбцов. Это коэффициент масштабирования для настройки ваших потребностей.

Вы можете реализовать этот метод в recyclerView onMeasure. Сначала создайте класс java AutofitRecyclerView

 public class AutofitRecyclerView extends RecyclerView { //private GridLayoutManager manager; private StaggeredGridLayoutManager manager; private int columnWidth = -1; public AutofitRecyclerView(Context context) { super(context); init(context, null); } public AutofitRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public AutofitRecyclerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs); } private void init(Context context, AttributeSet attrs) { if (attrs != null) { int[] attrsArray = { android.R.attr.columnWidth }; TypedArray array = context.obtainStyledAttributes(attrs, attrsArray); columnWidth = array.getDimensionPixelSize(0, -1); array.recycle(); } manager = new StaggeredGridLayoutManager(1, GridLayoutManager.VERTICAL); setLayoutManager(manager); } @Override protected void onMeasure(int widthSpec, int heightSpec) { super.onMeasure(widthSpec, heightSpec); if (columnWidth > 0) { int spanCount = Math.max(1, getMeasuredWidth() / columnWidth); manager.setSpanCount(spanCount); } }} 

В вашем файле макета xlm activity_main.xml

 <yourpackagename.AutofitRecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:columnWidth="@dimen/column_width" android:clipToPadding="false"/> 

Затем установите переменную в ширину каждого элемента в размере файла значений значений значений / dimens.xml

 <resources> <dimen name="column_width">250dp</dimen> </resources> 

Это может быть для разных значений разрешения экрана – xxhdpi / dimens.xml

 <resources> <dimen name="column_width">280dp</dimen> </resources> 

В вашей деятельности в событии onCreate введите следующий код

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); recyclerView.addItemDecoration(new MarginDecoration(this)); recyclerView.setHasFixedSize(true); recyclerView.setAdapter(new NumberedAdapter(50)); } 

В событии onCreate () вы можете использовать StaggeredGridLayoutManager

 mRecyclerView = (RecyclerView) v.findViewById(R.id.recyclerView); mStaggeredGridLayoutManager = new StaggeredGridLayoutManager( 1, //number of grid columns GridLayoutManager.VERTICAL); mRecyclerView.setLayoutManager(mStaggeredGridLayoutManager); 

Затем, когда пользователь поворачивает экран, фиксирует событие и автоматически меняет количество столбцов

 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { mStaggeredGridLayoutManager.setSpanCount(1); } else { //show in two columns mStaggeredGridLayoutManager.setSpanCount(2); } } 

Я закончил работу с этим методом onCreate.

 private RecyclerView recyclerView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView) findViewById(R.id.recycler_view); recyclerView.setHasFixedSize(true); Configuration orientation = new Configuration(); if(this.recyclerView.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); } else if (this.recyclerView.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { recyclerView.setLayoutManager(new GridLayoutManager(this, 4)); } connectGetApiData(); } 

Это отлично работает для моего приложения.