标签: gridlayoutmanager

RecycleView 的跨度大小

在此处输入图片说明

我正在尝试使用 RecyclerView 和 GridLayoutManager 实现类似于上图的布局,我尝试根据位置设置 setSpanSizeLookup 但无法模仿上面的设计..

有人可以帮忙吗?

    mRecyclerView = (RecyclerView) contentView;
    mRecyclerView.setHasFixedSize(false);

    GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 3);
    gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            return 3 - (position % 3);
        }
    });

    mRecyclerView.setLayoutManager(gridLayoutManager);
Run Code Online (Sandbox Code Playgroud)

..

我得到了什么
在此处输入图片说明

android gridlayoutmanager android-recyclerview

5
推荐指数
1
解决办法
6151
查看次数

Recyclerview 网格布局管理器首先填充一列

我想要一个 recyclerview 布局管理器,其工作方式类似于具有两列的 GridlayoutManager,但先填充第一列,然后再将项目添加到第二列。或者更确切地说,将剩余的项目添加到第二列。有什么建议么?

android gridlayoutmanager android-recyclerview

5
推荐指数
1
解决办法
2392
查看次数

RecyclerView 中的中心列

我正在尝试创建动态RecyclerView布局。我使用的是GridLayoutManager三列。

我需要包装每个网格项并将列居中(如附件所示)。

我试过一个StaggeredGridLayout,我试过一个WrapGridLayoutManager 但这些都不起作用

这是我的RecyclerView

 <android.support.v7.widget.RecyclerView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/categories_grid"
        android:layout_marginTop="@dimen/feed_item_margin"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>
Run Code Online (Sandbox Code Playgroud)

和我的RecyclerView项目:

 <LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:background="@drawable/first_time_category_unselected"
    android:layout_width="wrap_content"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/category_name"
        android:layout_marginLeft="@dimen/feed_item_margin"
        android:layout_gravity="center_vertical"
        android:textColor="@color/black_colour"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ImageView
        android:id="@+id/category_status_icon"
        android:layout_gravity="center_vertical"
        android:background="@drawable/icon_follow"
        android:layout_marginLeft="@dimen/feed_item_margin"
        android:layout_marginRight="@dimen/feed_item_margin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

这是我用来实现网格间距的装饰:

public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
    private int halfSpace;

    public SpacesItemDecoration(int space) {
        this.halfSpace = space / 2;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State …
Run Code Online (Sandbox Code Playgroud)

android gridlayoutmanager android-recyclerview

5
推荐指数
1
解决办法
2675
查看次数

RecyclerView 中的 GridLayoutManager 3 列

我正在尝试使用 3 列制作简单的 GridLayout,但是虽然我得到了 3 列,但行之间却出现了奇怪的间隙。所以,我在一行中得到 3 个图像而不是一行是空的(它似乎具有与 abov 行高度匹配的高度(有图像),然后是 3 个图像的行,而不是奇怪的间隙......等等。我预计不会得到比空白差距。如何消除这个空白差距?试图在回收站视图上将 wrap_content 设置为 layout_height,而片段没有帮助。这是我的代码:

    final GridLayoutManager layoutManager = new GridLayoutManager(this,3);
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)

这是活动的xml:

   <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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.adriagate.adriagateonlineandroid.activities.ImagesActivity">


<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/fragmentImagesHeader"
    android:name="com.adriagate.adriagateonlineandroid.fragments.ImagesHeader"
    tools:layout="@layout/fragment_images_header" android:layout_width="match_parent"
    android:layout_height="match_parent" >
</fragment>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/fragmentImagesGrid"
    android:name="com.adriagate.adriagateonlineandroid.fragments.ImagesList"
    tools:layout="@layout/fragment_images_list" android:layout_width="match_parent"
    android:layout_height="wrap_content" >
</fragment>
   </RelativeLayout>  
Run Code Online (Sandbox Code Playgroud)

请注意,此布局有一个名为 fragmentImagesGrid 的重要片段,它具有以下布局:

   <FrameLayout 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"
tools:context="com.adriagate.adriagateonlineandroid.fragments.ImagesList">

    <android.support.v7.widget.RecyclerView
      android:id="@+id/recycler_view_images"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
     tools:listitem="@layout/recycler_view_images_one_row"
    >
Run Code Online (Sandbox Code Playgroud)

</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

这是回收器视图中一个元素的布局:

   <?xml version="1.0" encoding="utf-8"?>
     <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:orientation="vertical"
       android:layout_width="wrap_content" …
Run Code Online (Sandbox Code Playgroud)

android gridlayoutmanager android-recyclerview

5
推荐指数
1
解决办法
4575
查看次数

让最后一个RecyclerView Item填充RecyclerView中的空格(如果数据计数为奇数)

到目前为止我一直在尝试创建一个recyclerView,但现在我遇到了一个问题。

我需要让它看起来像这样

在此输入图像描述

我需要将其设置为类似网格的列表,但是我无法将它们并排放置。

其次,如果最后一项是“单独的”,我需要最后一项来填充两个空格。

有任何想法吗?

android gridlayoutmanager android-recyclerview linearlayoutmanager

5
推荐指数
1
解决办法
2296
查看次数

如何检测 RecyclerView 何时滚动到最顶部位置

我上面有 RecyclerView,我有一个 AppBarLayout,它的高度大于 255 像素。当用户滚动 RecyclerView 时,AppBarLayout 会出现问题。为了避免这种情况,我决定手动扩展 AppBarLayout。我的 RecyclerView 由 GridLayoutManager 制成,跨度为 3。我使用下面的代码来收听 RecyclerView topreach

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
            int firstVisiblePosition = ((LinearLayoutManager)recyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPosition();
            if (firstVisiblePosition == 0) {
                appBarLayout.setExpanded(true, true);
            }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

android gridlayoutmanager android-recyclerview android-appbarlayout

5
推荐指数
1
解决办法
6560
查看次数

RecycleView 的 setInitialPrefetchItemCount 不起作用

我试图通过使用支持库 25.1 中引入的新 API 提前预取视图来提高用户在滚动图像网格时的体验,以控制 RecycleView 中预取项目的数量。

GridLayoutManager layoutManager = new GridLayoutManager(this.getContext(), PhotoGridViewHolder.SPAN_SIZE);
layoutManager.setItemPrefetchEnabled(true);
layoutManager.setInitialPrefetchItemCount(30); 
photosRecycleView.setLayoutManager(layoutManager);
... add 100 photos to the adapter ...
Run Code Online (Sandbox Code Playgroud)

我还为我的 ViewHolders 添加了日志记录,以便我可以查看绑定是否真的发生了。

void bind(final Photo photo, int position) {
    // I expcet to see 30 logs without event scrolling as the intial set to 30.
    log.d("binding photo: " + photo.getId());
    loadPhoto(photo);
}
Run Code Online (Sandbox Code Playgroud)

但是,它似乎不起作用,因为我加载了 100 张图像的列表,但我只看到了几个日志条目(只是获取了可见项目),但是我希望看到 30,因为我将它设置为这样.

android gridlayoutmanager android-recyclerview

5
推荐指数
2
解决办法
4648
查看次数

RecyclerView - 如何使 GridLayoutManager 强制将某些项目放置在下一行

我使用 GridLayoutManager 将项目垂直放置在 RecyclerView 中。每个项目占用一个跨度。现在我希望一些项目结束当前行,因此下一个项目放置在其下方的新行上。每个项目只能占据一个跨度,以便它们的宽度相同。

例子:

在此输入图像描述

item[4] 将放置在下一行,而不是放在 item[3] 之后。item[3] 之后的空间应保留未使用。

我尝试使用 SpanSizeLookup,但它对span index我来说没有任何意义,任何值似乎都没有任何作用。

有人可以建议解决方案吗?

android gridlayoutmanager android-recyclerview

5
推荐指数
1
解决办法
1624
查看次数

具有水平 GridLayoutManager 的 RecyclerView 将其高度调整为最大行

我想用RecyclerViewwithGridLayoutManager来实现这样的目标:

目标

这是GridLayoutManager水平方向和 2 行。对我来说重要的是它RecyclerView被设置为wrap_content.

所以我试图用这样的代码来实现我的目标:

MainActivity.kt

class MainActivity : AppCompatActivity() {

    private val adapter = Adapter()
    private val layoutManager = GridLayoutManager(this, 2, RecyclerView.HORIZONTAL, false)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        recyclerView.adapter = adapter
        recyclerView.layoutManager = layoutManager

        adapter.submitList(listOf(Unit, Unit, Unit, Unit))
    }
}
Run Code Online (Sandbox Code Playgroud)

Adapter.kt

class Adapter : ListAdapter<Any, ItemHolder>(DiffCallback()) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(viewType, parent, false)
        return ItemHolder(itemView)
    }

    override fun onBindViewHolder(holder: …
Run Code Online (Sandbox Code Playgroud)

android kotlin gridlayoutmanager android-recyclerview androidx

5
推荐指数
1
解决办法
2312
查看次数

OnCreateViewHolder 性能问题

我遇到了 RecyclerView 的问题,我想你们可以帮助我。所以问题是:膨胀项目视图xml需要太多时间。布局是网格布局,一行 3 个项目,每个项目都有一个复杂的 UI 外观。

所以首先我使用了 android studio 的分析器来分析它,我看到 CPU 在创建时有一个显着的颠簸。即使我删除了整个绑定代码,当我进入这个屏幕/在回收器视图中滚动时仍然需要一些时间。

将项目分成更小的项目会很疯狂,因为它已经是一个矩阵(正如我所说的,连续 3 个项目)。

所以我想了两件事:

  1. 也许我可以提前创建更多的视图持有者,知道怎么做吗?我看到了类似的方法RecyclerView.setItemViewCacheSizeLayoutManager.setInitialPrefetchItemCount但没有运气让它发生(它仍然多次调用 create )

  2. AsyncLayoutInflater 怎么样?有人在 RecyclerView 中使用它吗?

任何新想法都会很棒!

这是视图 xml 的样子:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        card_view:cardCornerRadius="3dp"
        card_view:cardElevation="2.5dp"
        card_view:cardUseCompatPadding="true">

        <CustomView1>

        </CustomView1>

        <CustomView2>

        </CustomView2>

        <CustomView3>

        </CustomView3>

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:layout_gravity="end"
            android:layout_marginEnd="2dp"
            android:layout_marginStart="2dp"
            android:layout_marginTop="2dp"
            android:adjustViewBounds="true" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <include layout="@layout/someLayoutToInclude" />

    </android.support.v7.widget.CardView>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

OnCreateViewHolder 看起来像:

LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(viewType, parent, false); …
Run Code Online (Sandbox Code Playgroud)

java android gridlayoutmanager android-recyclerview

5
推荐指数
1
解决办法
1343
查看次数