Элемент центрирования Android в RecyclerView
Я новичок в андроиде. Я не уверен, почему я не могу сосредоточить свой элемент в RecyclerView.
Что я хочу, как показано ниже: -
![Actual]()
Какой рендеринг андроида выглядит следующим образом: -
![Reality]()
Есть ли способ переместить элементы в RecyclerView в центр? Так оно будет выглядеть так: -
![i want like this]()
Я также предоставляю файлы макета, как показано ниже: -
recycler_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:id="@+id/calendar_itemContainer">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="April"
android:id="@+id/calendar_txtMonth"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:textColor="#ff58636d"
android:textSize="16sp"
android:gravity="center|center_vertical|center_horizontal"
android:paddingTop="8dp"
android:paddingLeft="12dp"
android:paddingRight="12dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="21"
android:id="@+id/calendar_txtDay"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/calendar_txtMonth"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:textColor="#ff58636d"
android:textSize="40sp"
android:layout_marginTop="-10dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingBottom="5dp"
android:gravity="center|center_vertical|center_horizontal" />
</RelativeLayout>
fragment_calendar.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/calendar_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="horizontal"
android:background="#ff2c3e50" />
</RelativeLayout>
и коды java: -
CalendarAdapter mAdapter = new CalendarAdapter(mDataset);
mLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter.setCalendarCallbacks(this);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
selectItem(mCurrentSelectedPosition);
Ответы
Ответ 1
Я пытался сделать то, о чем я думаю, это то же самое, о чем вы спрашиваете, когда я столкнулся с этим сообщением. Здесь решение, которое я закончил, использовал.
Создайте свой собственный подкласс LinearLayoutManager и переопределите getPaddingLeft() и getPaddingRight(), как это.
public class CustomLayoutManager extends LinearLayoutManager {
private int mParentWidth;
private int mItemWidth;
public CustomLayoutManager(Context context, int parentWidth, int itemWidth) {
super(context);
mParentWidth = parentWidth;
mItemWidth = itemWidth;
}
@Override
public int getPaddingLeft() {
return Math.round(mParentWidth / 2f - mItemWidth / 2f);
}
@Override
public int getPaddingRight() {
return getPaddingLeft();
}
}
parentWidth
должна быть шириной RecyclerView
, а itemWidth
должна быть шириной каждого из ваших дочерних представлений, как в пикселях. Очевидно, что это работает, только если вы знаете, что все ваши дочерние представления будут иметь одинаковую ширину.
Затем просто используйте этот менеджер макетов с помощью RecyclerView
Ответ 2
установить recyclerview в:
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
исправил это для меня
Ответ 3
Ответ @majormajors был близок, но начнется с центрирования первого элемента в списке, а не центра элементов (в целом), как показано на изображениях. Для проверки общей ширины элемента необходимо выполнить дополнительный расчет. Я изменил код, отправленный @majormajors.
public class CenterItemLayoutManager extends LinearLayoutManager {
private final int parentWidth;
private final int itemWidth;
private final int numItems;
public CenterItemLayoutManager(
final Context context,
final int orientation,
final int parentWidth,
final int itemWidth,
final int numItems) {
super(context, orientation, false);
this.parentWidth = parentWidth;
this.itemWidth = itemWidth;
this.numItems = numItems;
}
@Override
public int getPaddingLeft() {
final int totalItemWidth = itemWidth * numItems;
if (totalItemWidth >= parentWidth) {
return super.getPaddingLeft(); // do nothing
} else {
return Math.round(parentWidth / 2f - totalItemWidth / 2f);
}
}
@Override
public int getPaddingRight() {
return getPaddingLeft();
}
}
В этом случае элементы будут центрироваться только в том случае, если они не превышают ширину recyclerview... иначе она будет действовать так, как обычно.
Ответ 4
Легко, как пирог с новым классом, добавленным в библиотеку поддержки, android.support.v7.widget.LinearSnapHelper
Просто создайте экземпляр и присоедините его к recyclerView, как показано ниже:
LinearSnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
Ответ 5
Просто добавлено android:orientation="vertical"
в корень из представления элемента. Попробуем это.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="180dp"
android:orientation="vertical"
android:padding="4dp">
<ImageView
android:id="@+id/movie_column_photo"
android:layout_width="80dp"
android:layout_height="120dp"
android:layout_gravity="center_horizontal"/>
<TextView
android:id="@+id/movie_column_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"/>
</LinearLayout>