
我正在尝试使用 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)
..
我得到了什么

我想要一个 recyclerview 布局管理器,其工作方式类似于具有两列的 GridlayoutManager,但先填充第一列,然后再将项目添加到第二列。或者更确切地说,将剩余的项目添加到第二列。有什么建议么?
我正在尝试创建动态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) 我正在尝试使用 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) 到目前为止我一直在尝试创建一个recyclerView,但现在我遇到了一个问题。
我需要让它看起来像这样
我需要将其设置为类似网格的列表,但是我无法将它们并排放置。
其次,如果最后一项是“单独的”,我需要最后一项来填充两个空格。
有任何想法吗?
android gridlayoutmanager android-recyclerview linearlayoutmanager
我上面有 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
我试图通过使用支持库 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,因为我将它设置为这样.
我使用 GridLayoutManager 将项目垂直放置在 RecyclerView 中。每个项目占用一个跨度。现在我希望一些项目结束当前行,因此下一个项目放置在其下方的新行上。每个项目只能占据一个跨度,以便它们的宽度相同。
例子:
item[4] 将放置在下一行,而不是放在 item[3] 之后。item[3] 之后的空间应保留未使用。
我尝试使用 SpanSizeLookup,但它对span index我来说没有任何意义,任何值似乎都没有任何作用。
有人可以建议解决方案吗?
我想用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
我遇到了 RecyclerView 的问题,我想你们可以帮助我。所以问题是:膨胀项目视图xml需要太多时间。布局是网格布局,一行 3 个项目,每个项目都有一个复杂的 UI 外观。
所以首先我使用了 android studio 的分析器来分析它,我看到 CPU 在创建时有一个显着的颠簸。即使我删除了整个绑定代码,当我进入这个屏幕/在回收器视图中滚动时仍然需要一些时间。
将项目分成更小的项目会很疯狂,因为它已经是一个矩阵(正如我所说的,连续 3 个项目)。
所以我想了两件事:
也许我可以提前创建更多的视图持有者,知道怎么做吗?我看到了类似的方法RecyclerView.setItemViewCacheSize,LayoutManager.setInitialPrefetchItemCount但没有运气让它发生(它仍然多次调用 create )
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)