我正在使用带有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) 我正在使用交错网格布局。以下是代码:
StaggeredGridLayoutManager glm= new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
glm.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
Run Code Online (Sandbox Code Playgroud)
我GAP_HANDLING_NONE用来避免图像从一列交换到另一列。
当我启动应用程序时,屏幕的开头是:
向下滚动到底部后,当我回到顶部时。随机以下三张图片显示布局(它不断变化)
我正在使用垂直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) 嗨我从我的应用程序上的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) 我收到了一些关于 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) 我有一个StaggeredGrid,RecyclerView我试图动态设置图像高度onBindViewHolder.我认为StaggeredGrid应该自动处理所有这些,所以我设置android:layout_width="match_parent并android:scaleType="fitStart在上面ImageView,但图像周围有很多空隙.
由于StaggeredGrid没有达到它,我试图通过动态定义图像高度来帮助它onBindViewHolder.我提前有图像的宽度和高度,但网格的单元格宽度不可用.我试过holder.cardView.getLayoutParams().width和getMeasuredWidth(),但他们都返回零个或小的数字.我知道还有其他地方可以使用单元格宽度,但我确实需要它,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
我正在开发一个 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
我正在尝试使用 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
我有表示问题RecyclerView用StaggeredGridLayoutManager其项包含一个imageview和所述图像中装入imageview使用glide.我面临的问题是,在图像加载后,它们不会交错并且尺寸相同,两列之间也存在很大的差距.如何在列中没有间隙的情况下改变图像的高度?
android staggered-gridview staggeredgridlayout android-recyclerview android-glide
我想知道是否有办法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
我想使用staggeredGridLayoutManager将类似listview的headerview添加到recyclerview中。我已经搜索了所有库,但只找到了这个RecyclerHeaderView,但是该库对LinearLayoutManager或GridLayoutManager有限制。是否可以为staggeredGridLayout添加headerview?
我在垂直方向使用带有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
我有一个包含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