标签: staggeredgridlayout

使用带有StaggeredGridLayoutManager的RecyclerView时,如何避免项目之间的双重空间?

我正在使用带有StaggeredGridLayoutManager的RecyclerView来创建一个两列列表.但是如何在左列和右列之间设置右边距.我已经使用此代码从顶部创建右边距,但如何解决列之间的双倍空格.

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

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

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        outRect.left = space;
        outRect.right = space;
        outRect.bottom = space;

        // Add top margin only for the first or second item to avoid double space between items
        // Add top margin only for the first or second item to avoid double space between items
        if((parent.getChildCount() > 0 && parent.getChildPosition(view) == 0) …
Run Code Online (Sandbox Code Playgroud)

android margins staggeredgridlayout android-recyclerview

14
推荐指数
4
解决办法
7821
查看次数

android:staggergridlayout 同时向上移动随机播放

我正在使用交错网格布局。以下是代码:

StaggeredGridLayoutManager glm= new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
glm.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
Run Code Online (Sandbox Code Playgroud)

GAP_HANDLING_NONE用来避免图像从一列交换到另一列。

当我启动应用程序时,屏幕的开头是:

在此处输入图片说明

向下滚动到底部后,当我回到顶部时。随机以下三张图片显示布局(它不断变化)

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

android staggeredgridlayout android-recyclerview

9
推荐指数
2
解决办法
1490
查看次数

如何设置交错网格跨度计数以使用可用的屏幕宽度?

我正在使用垂直StaggeredGridLayoutManager来显示一些缩略图.每行包含1英寸宽和150度高的卡片视图.我的问题是如何设置交错网格跨度计数以使用屏幕的可用物理宽度?

CardViewRow.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:orientation="vertical"
    card_view:cardCornerRadius="0dp"
    card_view:cardUseCompatPadding="true" >


   <LinearLayout
       android:gravity="center"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:background="@drawable/card_selector"
       android:orientation="vertical">
       <FrameLayout
           android:layout_width="match_parent"
           android:layout_height="match_parent">


       <ImageView
           android:id="@+id/thumbnail"
           android:layout_width="300dp"
           android:layout_height="150dp"
           android:scaleType="centerCrop"/>

           <LinearLayout
               android:weightSum="2"
               android:padding="5dp"
               android:layout_gravity="bottom"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:orientation="horizontal"
               android:background="#80000000">

               <TextView
                   android:id="@+id/size_txt"
                   android:layout_weight="1"
                   android:textSize="12sp"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:textColor="@color/silver"
                   android:gravity="left"/>
               <TextView
                   android:layout_weight="1"
                   android:gravity="right"
                   android:textColor="@color/silver"
                   android:id="@+id/time_txt"
                   android:textSize="12sp"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"/>

           </LinearLayout>
           <View
               android:id="@+id/selector"
               android:visibility="invisible"
               android:background="#950096ff"
               android:layout_width="match_parent"
               android:layout_height="match_parent">

           </View>
       </FrameLayout>
       <TextView
           android:id="@+id/title_txt"
           android:padding="8dp"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:maxLines="5" />
       </LinearLayout>


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

目前我正在使用此代码.(致谢:mstrengis)

  DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int cardWidth …
Run Code Online (Sandbox Code Playgroud)

android width staggeredgridlayout

7
推荐指数
1
解决办法
2694
查看次数

StaggeredGridLayoutManager calculateCachedStart()IndexOutOfBoundsException

嗨我从我的应用程序上的Fabric获得了错误报告 - > StaggeredGridLayoutManager上的IndexOutOfBoundsException calculateCachedStart()方法

在我的应用程序上有很多用法StaggeredGridLayoutManager.有任何想法修复此错误或跟踪我的应用程序中哪一个导致此错误?

使用编译"com.android.support:recyclerview-v7:25.2.0

Fatal Exception: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
       at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:260)
       at java.util.ArrayList.get(ArrayList.java:313)
       at android.support.v7.widget.StaggeredGridLayoutManager$Span.calculateCachedStart(StaggeredGridLayoutManager.java:2457)
       at android.support.v7.widget.StaggeredGridLayoutManager$Span.getStartLine(StaggeredGridLayoutManager.java:2474)
       at android.support.v7.widget.StaggeredGridLayoutManager.checkSpanForGap(StaggeredGridLayoutManager.java:410)
       at android.support.v7.widget.StaggeredGridLayoutManager.hasGapsToFix(StaggeredGridLayoutManager.java:359)
       at android.support.v7.widget.StaggeredGridLayoutManager.checkForGaps(StaggeredGridLayoutManager.java:284)
       at android.support.v7.widget.StaggeredGridLayoutManager.onScrollStateChanged(StaggeredGridLayoutManager.java:319)
       at android.support.v7.widget.RecyclerView.dispatchOnScrollStateChanged(RecyclerView.java:4596)
       at android.support.v7.widget.RecyclerView.setScrollState(RecyclerView.java:1371)
       at android.support.v7.widget.RecyclerView.cancelTouch(RecyclerView.java:2890)
       at android.support.v7.widget.RecyclerView.onTouchEvent(RecyclerView.java:2868)
       at android.view.View.dispatchTouchEvent(View.java:8593)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2493)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2157)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2495)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2171)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2495)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2171)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2530)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2171)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2530)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2171)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2530)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2171)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2530)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2171)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2530)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2171)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2530)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2171)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2530) …
Run Code Online (Sandbox Code Playgroud)

android indexoutofboundsexception staggeredgridlayout

7
推荐指数
1
解决办法
247
查看次数

StaggeredGridLayoutManager 中的 NullPointerException

我收到了一些关于 StaggeredGridLayoutManager 中发生的 NullPointerException 的崩溃报告。看起来我的用户中有大约 10% 遇到了这个问题。

我有一个非常基本的 RecyclerView 和一个基本的适配器,没什么特别的,我确实尝试在我的设备中重现这个错误,但完全没有运气。

这是我收到的原始报告:

java.lang.NullPointerException
   at android.support.v7.widget.StaggeredGridLayoutManager.recycleFromStart(StaggeredGridLayoutManager.java:1661)
   at android.support.v7.widget.StaggeredGridLayoutManager.recycle(StaggeredGridLayoutManager.java:1529)
   at android.support.v7.widget.StaggeredGridLayoutManager.fill(StaggeredGridLayoutManager.java:1471)
   at android.support.v7.widget.StaggeredGridLayoutManager.scrollBy(StaggeredGridLayoutManager.java:1846)
   at android.support.v7.widget.StaggeredGridLayoutManager.scrollVerticallyBy(StaggeredGridLayoutManager.java:1764)
   at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:3062)
   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803)
   at android.view.Choreographer.doCallbacks(Choreographer.java:603)
   at android.view.Choreographer.doFrame(Choreographer.java:572)
   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789)
   at android.os.Handler.handleCallback(Handler.java:733)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:157)
   at android.app.ActivityThread.main(ActivityThread.java:5335)
   at java.lang.reflect.Method.invokeNative(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:515)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
   at dalvik.system.NativeStart.main(NativeStart.java)
Run Code Online (Sandbox Code Playgroud)

我不知道发生了什么。我想也许我在布局管理器之前设置了适配器,但不,事实并非如此。

我希望有人可以对此有所了解。

提前致谢!

更新:

我正在从我的应用程序中复制一些与 RecyclerView 相关的代码。

此代码来自片段:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    RecyclerView.LayoutManager layout = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)

    mRecyclerView = (RecyclerView)view.findViewById(R.id.recyclerView);
    mRecyclerView.setLayoutManager(layout);
    mRecyclerView.setAdapter(mAdapter);
} …
Run Code Online (Sandbox Code Playgroud)

java android staggeredgridlayout android-recyclerview

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

如何从StaggeredGridLayoutManager中找到单元格宽度?

我有一个StaggeredGrid,RecyclerView我试图动态设置图像高度onBindViewHolder.我认为StaggeredGrid应该自动处理所有这些,所以我设置android:layout_width="match_parentandroid:scaleType="fitStart在上面ImageView,但图像周围有很多空隙.

由于StaggeredGrid没有达到它,我试图通过动态定义图像高度来帮助它onBindViewHolder.我提前有图像的宽度和高度,但网格的单元格宽度不可用.我试过holder.cardView.getLayoutParams().widthgetMeasuredWidth(),但他们都返回零个或小的数字.我知道还有其他地方可以使用单元格宽度,但我确实需要它,onBindViewHolder因此我可以设置和调整图像.

关于如何通过利用这个来实现这一目标的任何想法StaggeredGrid?任何建议或经验表示赞赏!

我的活动是这样的:

mLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(mLayoutManager);
Run Code Online (Sandbox Code Playgroud)

在我的适配器中:

@Override
public void onBindViewHolder(MyAdapter.MyViewHolder holder, int position) {
    MyModel item = mData.get(position);

    int imageWidth = item.getFeatured_image().getWidth();
    int imageHeight = item.getFeatured_image().getHeight();
    int cellWidth = 540; // <==== how to find dynamically??!!

    ViewGroup.LayoutParams imageLayoutParams = holder.thumbnailImageView.getLayoutParams();
    imageLayoutParams.width = cellWidth;
    imageLayoutParams.height = imageHeight * cellWidth / …
Run Code Online (Sandbox Code Playgroud)

android android-layout android-adapter staggered-gridview staggeredgridlayout

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

在 Android 中使用 RecyclerView 和 StaggeredGridLayoutManager 时,单元格不交错

我正在开发一个 Android 应用程序。我不擅长Android开发。在我的应用程序中,我将 RecyclerView 和 CardView 与 StaggeredGridLayoutManager 一起使用。因为我希望列表中的每个单元格大小彼此不同,并且如下图所示交错。

在此处输入图片说明

但是当我运行我的应用程序时,单元格不交错并且它们的大小彼此相等。

这是截图

在此处输入图片说明

这是我的回收站视图 XML

<android.support.v7.widget.RecyclerView
        android:id="@+id/df_rv_destination"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
Run Code Online (Sandbox Code Playgroud)

这是单元格项目的 XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:id="@+id/di_iv_image"
            android:scaleType="centerCrop"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <TextView
            android:textSize="17dp"
            android:textColor="@color/white"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginBottom="10dp"
            android:layout_alignParentLeft="true"
            android:layout_alignParentBottom="true"
            android:id="@+id/di_tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </RelativeLayout>
</android.support.v7.widget.CardView>
Run Code Online (Sandbox Code Playgroud)

这就是我如何使用 StaggerGridLayoutManager 配置我的 RecyclerView

        StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, 1);
        rcDestinations.setLayoutManager(staggeredGridLayoutManager);
        rcDestinations.setItemAnimator(new DefaultItemAnimator());
        regionsList = new ArrayList<Region>();
        destinationsAdapter = new DestinationsAdapter(getActivity(),regionsList);
        rcDestinations.setAdapter(destinationsAdapter);
Run Code Online (Sandbox Code Playgroud)

那么为什么我的 RecyclerView 不交错呢?我该如何解决?

android staggered-gridview android-cardview staggeredgridlayout android-recyclerview

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

了解 RecyclerView 项目何时首次显示 (Android)

我正在尝试使用 Google Analytics 增强型电子商务在 RecyclerView StaggeredGrid 上发送我的产品的“印象”。每次用户滚动时,我都会检查哪些产品可见并发送点击:

public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    super.onScrollStateChanged(recyclerView, newState);

    if (newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
        for (int i = firstVisibleItemPosition; i <= lastVisibleItemPosition; i++) {
            Offer offer = mListViewContentFetcher.getApiObjects().get(i);

            Product product = new Product()
                .setId(offer.getCode())
                .setName(offer.getTitle())
                .setCategory(offer.getStore().getName())
                .setPosition(i);

            builder.addImpression(product, "products_list");
        }

        mTracker.setScreenName("Products List");
        mTracker.send(builder.build());
    }
}
Run Code Online (Sandbox Code Playgroud)

但我还需要在第一次构建 RecyclerView 并且第一个产品可见时运行它。

我怎么知道第一个项目已经准备好?我尝试在 recyclerview 和 onBindViewHolder 上使用 ViewTreeObserver 但没有成功。

编辑:这是在视图页面上使用的片段内部,所以我需要知道这些项目何时真正可见,而不仅仅是添加。

谢谢

android google-analytics visible staggeredgridlayout android-recyclerview

4
推荐指数
1
解决办法
2681
查看次数

RecyclerView与StaggeredGridLayoutManager一起从Glide加载图像

我有表示问题RecyclerViewStaggeredGridLayoutManager其项包含一个imageview和所述图像中装入imageview使用glide.我面临的问题是,在图像加载后,它们不会交错并且尺寸相同,两列之间也存在很大的差距.如何在列中没有间隙的情况下改变图像的高度?

android staggered-gridview staggeredgridlayout android-recyclerview android-glide

3
推荐指数
2
解决办法
5221
查看次数

GridLayoutManager 自定义

我想知道是否有办法gridlayoutmanager在 android 中自定义以具有像此草图这样的水平布局: 在此处输入图片说明

我尝试了一些在 Github 中找到的布局管理器,但没有一个可以帮助我实现这种布局管理器。

像这样:

public class CustomLayoutManager extends StaggeredGridLayoutManager {
public CustomLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
}

public CustomLayoutManager(int spanCount, int orientation) {
    super(spanCount, orientation);
}

@Override
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) {
    super.onMeasure(recycler, state, widthSpec, heightSpec);
}

@Override
public void setSpanCount(int spanCount) {
    super.setSpanCount(spanCount);
}}
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激谢谢

android layout-manager gridlayoutmanager staggeredgridlayout

2
推荐指数
1
解决办法
2461
查看次数

如何使用staggeredGridLayoutManager将headerview添加到recyclerview

我想使用staggeredGridLayoutManager将类似listview的headerview添加到recyclerview中。我已经搜索了所有库,但只找到了这个RecyclerHeaderView,但是该库对LinearLayoutManager或GridLayoutManager有限制。是否可以为staggeredGridLayout添加headerview?

android staggeredgridlayout android-recyclerview

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

使用StaggeredGridLayoutManager的RecyclerView的Android缩放项高度来匹配列宽

我在垂直方向使用带有StaggeredGridLayoutManager的RecyclerView.RecyclerView的项目只包含一个视图 - ImageView.我希望ImageView高度可以缩放以匹配RecyclerView的列宽并保持它包含的照片的宽高比.目前此图像视图的参数是: android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="centerCrop" 但RecyclerView中项目的高度与照片的原始高度匹配,而照片只是居中.怎么可能实现这一目标?

android imageview staggered-gridview staggeredgridlayout android-recyclerview

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

为什么我的StaggeredGrid RecyclerView布局每个项目,而不仅仅是可见的?

我有一个包含370个项目的交错网格,带有图像.

我想确保快速回收物品以注意内存,但是创建ViewHolder然后绑定到适配器中的每个项目,并且不关注子项是否可见

我尝试了以下内容

StaggeredGridLayoutManager lm = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
rv.setLayoutManager(lm);

rv.setItemViewCacheSize(20); //Has no effect

RecyclerView.RecycledViewPool pool = new RecyclerView.RecycledViewPool();
pool.setMaxRecycledViews(0, 20);
rv.setRecycledViewPool(pool); //also has no effect
Run Code Online (Sandbox Code Playgroud)

日志显示onCreateViewHolder和onBindViewHolder每次调用185次.然后在恢复对onCreateViewHolder的调用之前调用onViewRecycled 185次,直到我们达到完整的370.

这对我来说可能是一个理解问题,但我认为RecyclerView应该只绑定那些可见的视图,或者仅仅支持20个视图,或者20个池中的20个,但是很多适合屏幕.如何使用StaggeredGridLayoutManager实现此目的?

如果我听滚动更改并使用findFirstCompletelyVisibleItemPositions和findLastCompletelyVisibleItemPositions,这仍然跨越适配器中的每一项,而不仅仅是适合屏幕的6项

我的适配器代码

class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {

    static final int NUM_COLS = 3;
    private final LayoutInflater mInflater;
    private final List<GridItem> mEntries;
    private int mLastExpanded; //stores where the last expanded item was
    private OnCardClickListener mOnItemClick;

    MyAdapter(Context context) {
        super();
        mEntries = new ArrayList<>();
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    void setOnTileClickListener(@Nullable OnCardClickListener listener) …
Run Code Online (Sandbox Code Playgroud)

android layout-manager staggeredgridlayout android-recyclerview

0
推荐指数
1
解决办法
982
查看次数