`

RecyclerView 中的 item 如何居中问题

阅读更多
一个很简单的Item布局,我只要让它由上而下排列,文字居中
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" 
    >

    <TextView
        android:id="@+id/item_0"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="8dp"
        android:textColor="@color/grayDark" 
        android:textSize="@dimen/font_2xbig"
        />

</LinearLayout>


然后代码这样写:很标准的使用方式吧?
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
		recyclerView.setHasFixedSize(true);
		 recyclerView.addItemDecoration(new DividerGridItemDecoration(this));
		recyclerView.setItemAnimator(new DefaultItemAnimator());
		LinearLayoutManager manager=new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
//		GridLayoutManager manager = new GridLayoutManager(this, 2);
		recyclerView.setLayoutManager(manager);
recyclerView.setAdapter(adapter...);


问题来了,无论你怎么设置item中各元素的layout_width是match_parent,都无法让文字居中,为什么?

这个问题还得从android的LayoutInflater.from(context).inflate(...)源码下手,

inflater在inflate一个xml时,需要知道parent的类型,才能生成对应的LayoutParams,才可以把xml根节点的attrs(如layout_width)读进去,代码如下:
// android.view.LayoutInflater
public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {
        synchronized (mConstructorArgs) {
    
    ...

    // Temp is the root view that was found in the xml
    final View temp = createViewFromTag(root, name, inflaterContext, attrs);

    ViewGroup.LayoutParams params = null;

    if (root != null) {
        if (DEBUG) {
            System.out.println("Creating params from root: " +
                    root);
        }
        // Create layout params that match root, if supplied
        params = root.generateLayoutParams(attrs);
        if (!attachToRoot) {
            // Set the layout params for temp if we are not
            // attaching. (If we are, we use addView, below)
            temp.setLayoutParams(params);
        }
    }

    ...

}

如果parent传进去为null,生成的View的LayoutParams为null,在RecyclerView.addView时,发现LayoutParams为null,则生成默认的LayoutParams,
// android.view.ViewGroup
protected LayoutParams generateDefaultLayoutParams() {
    return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
}

所以无论无论你怎么写,最外层的LinearLayout宽度为WRAP_CONTENT,如果那三个点的宽度为6dp,那么整个View的宽度也为6dp,所以无法居中。

所以要解决照这个问题需要在inflate的时候将parent传进去,如:
result = new DividerHolder(mInflater.inflate(R.layout.divider, parent, false));

同时,最后一个参数设置成false,如果不填该参数则抛异常,说先要removeAllViews()


衍生1,为何ListView加进去就是MATCH_PARENT的?
因为AbsListView重写的generateDefaultLayoutParams方法为
// android.widget.AbsListView
@Override
protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
    return new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT, 0);
}

衍生2,为何高度只能用minHeight控制?
同理,layout.xml根节点的attrs属性没被写到LayoutParams中!所以使用minHeight来控制高度的做法是可笑的!你所要做的是在inflate时把parent传进去!

RecyclerView自定义LayoutManager,打造不规则布局
http://blog.csdn.net/qibin0506/article/details/52676670
分享到:
评论

相关推荐

    RecyclerView横向滑动Item居中的问题

    当需要实现横向滑动并让每个Item居中显示,同时具备放大效果和拖动功能时,需要进行一系列定制化的设置。以下将详细讲解如何实现这些功能。 1. **RecyclerView的基本配置** 首先,你需要在布局XML文件中添加...

    RecyclerView子Item移动居中的实现(TV列表移动规则的实现)

    在电视界面内,焦点随着用户点击遥控器的方向键而移动,移动到单行列表边缘位置时,仍继续向屏幕...- 当列表内容超过一屏,焦点固定居中,内容项反向移动。 - 列表内容不足一屏时,焦点可移动到列表的最后一个选项。

    android recyclerview 滑动 item自动屏幕居中

    android recyclerview 滑动 item自动屏幕居中

    android居中显示item的recyclerview

    - `scrollToPosition()`:滚动到指定位置,确保中心item居中显示。 2. **居中计算**: 在自定义的LayoutManager中,你需要计算出当前屏幕中央应该显示哪个item。这通常涉及到滚动偏移量的计算。如果数据量少,你...

    RecyclerView滚动指定条目并在页面中居中

    以上就是如何在Android中使用RecyclerView滚动到指定位置并使其居中的详细步骤。注意,这个实现可能需要根据具体项目的需求进行调整。在实际开发中,还需要考虑性能优化,如避免不必要的滚动操作以及处理不同屏幕...

    一个用RecyclerView实现的画廊效果,被选中item居中放大,效果很自然。

    总的来说,这个“画廊”效果结合了RecyclerView的灵活性和强大的自定义能力,通过自定义ViewHolder、LayoutManager、Adapter和触摸事件处理,实现了选中item居中放大这一独特效果。这样的设计既提高了用户体验,也...

    Android-实现当item的宽度小于RecyclerView的宽度时候则居中显示

    总之,实现RecyclerView的item居中显示需要对RecyclerView的LayoutManager有深入的理解,并可能需要对其进行适当的扩展或自定义。通过这种方式,你可以创造出符合设计需求的个性化布局效果,提升应用程序的用户体验...

    androidTV 自定义RecyclerView让当前焦点item显示在中间

    AndroidTV中自定义RecyclerView 让当前焦点item显示在中间,调用smoothToCenter(pos)就可以。

    android TV常见需求,焦点item保持居中 —— RecyclerView自定义焦点滑动位置和滑动速度。

    尤其是类似Recyclerview这样本身带有滑动效果,为了醒目的显示当前焦点在什么位置,需要滑动的时候回添加大量的动画、高亮、阴影等效果。   同样,让焦点位置不变而列表主动滑动也是一种常见的提醒焦点的手段。...

    Recyclerview实现滑动放大ItemView

    Recyclerview实现滑动放大ItemView,原创不易,请宝宝们支持一下吧

    Android RecyclerView item选中放大被遮挡问题详解

    然而,当使用RecyclerView时,可能会遇到一个常见的问题:当itemView执行放大动画后,由于RecyclerView的绘制顺序机制,可能会被其他item View遮挡。这个问题主要由以下原因导致: 1. RecyclerView的绘制机制是按照...

    Andriod 自定义 RecyclerView 打造超强 Gallery效果 完整实例源码

    在Android开发中,RecyclerView是一个非常重要的组件,它取代了ListView,提供了更强大的性能和灵活性。本实例将深入探讨如何利用RecyclerView来实现一个超强的Gallery效果,这是一个常见的图像展示功能,通常用于...

    RecyclerView-SnapHelper:SnapHelper实现item随手势缩放的效果

    在本项目"RecyclerView-SnapHelper:SnapHelper实现item随手势缩放的效果"中,我们将探讨如何利用SnapHelper来实现用户手势操作时,RecyclerView中的Item能够进行平滑的缩放效果。 首先,SnapHelper的基本用法是通过...

    RecyclerView实现画廊效果.htm

    Android开发,基于RecyclerView实现照片画廊效果,选中位置居中显示,实现了第一个项目居中,最后一个项目居中,实现了RecyclerView平滑滑动

    RecyclerView 滚动到中间位置实例代码

    本实例主要探讨如何实现RecyclerView滚动至指定项并使其居中显示,这对于创建诸如瀑布流、轮播效果等场景非常有用。我们将通过以下几个关键步骤来详细讲解这个功能的实现: 1. **设置RecyclerView** 首先,我们需要...

    RecyclerView动画

    在Android开发中,RecyclerView是一个非常重要的组件,它用于展示可滚动的数据列表,具有高效的数据复用机制和灵活的布局管理器。本篇文章将深入探讨如何在RecyclerView中实现列表项的展示动画,以提升用户体验和...

    Android 自定义RecyclerView 实现真正的Gallery效果程序源码

    在Android开发中,RecyclerView是一个非常重要的组件,它用于展示可滚动的数据列表,具有高效的数据管理和流畅的滚动体验。本示例代码着重于如何通过自定义RecyclerView实现一个类似于Android原生Gallery的效果,即...

    Android横向GridView合并item放大item

    接着,要实现item的合并,可以利用LayoutInflater来复用视图,并在Adapter的`getView()`方法中根据数据动态调整每个item的宽度。如果两个相邻的item需要合并显示,那么在适配器中判断当前位置并调整布局。这种方法...

    自定义RecyclerView实现画廊效果

    这可以通过在RecyclerView外部添加自定义视图实现,或者通过设置Adapter的item装饰器完成。 总结来说,实现自定义RecyclerView的画廊效果,需要理解RecyclerView的工作原理,掌握Adapter和ViewHolder的设计,以及...

    Android-RecyclerView自定义LayoutManager

    1. `onLayoutChildren(Recycler recycler, State state)`:这是布局的核心方法,负责将item视图添加到RecyclerView中,根据当前状态重新布局所有的子视图。 2. `layoutDecorated(View child, int left, int top, ...

Global site tag (gtag.js) - Google Analytics