如何使用recyclerview实现水平gridlayoutmanager.固定行数.和水平滚动.像这样...
gridLayoutManager = new GridLayoutManager(getContext(), 1, GridLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(gridLayoutManager);
recyclerView.setHasFixedSize(true);
Run Code Online (Sandbox Code Playgroud)
我试着这样做.但这并没有在项目中显示任何内容.
我的一个适配器出了问题.我有一系列图像,我在网格中显示如下:
当我有一个单一屏幕的物品并且它们都显示正常时,这很有效.当有更多项目向下滚动时,会出现问题.最初当我向下滚动时,项目显示为空白,GridLayout容器在那里,显示图像的代码运行,但它们不会出现在屏幕上,如下所示:
如果我向上滚动,然后再次向下滚动,图像会显示在它们应该的位置:
看起来我需要刷新布局或告诉渲染器某些东西已经发生变化,但我尝试的任何东西似乎都没有做任何事情.我试过打电话requestLayout,invalidate但它似乎没有解决问题.我还注册了一个GlobalOnLayoutListener,但这并没有更好.
这是相关代码:
这是我的onBindViewHolder方法
final GridLayout grid = ((KKAlbumViewHolder) holder).mGridLayout;
grid.removeAllViews();
int width = grid.getWidth();
if(width > 0) {
albumHolder.setPreviewImages(posts);
}else {
albumHolder.itemView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
albumHolder.itemView.removeOnLayoutChangeListener(this);
albumHolder.setPreviewImages(posts);
albumHolder.mGridLayout.invalidate();
}
});
}
Run Code Online (Sandbox Code Playgroud)
这是我用来布局图像的方法.它基本上将图像放在不规则的网格中,因此如果有长图像或高图像,该图像将尝试占据整行或整列,具体取决于空闲空间.我设置参数宽度和高度的原因是毕加索不抱怨该.fit()方法:
public void setPreviewImages(ArrayList<KKPost> posts) {
Picasso picasso = Picasso.with(itemView.getContext());
int space = 0;
int …Run Code Online (Sandbox Code Playgroud) android android-gridlayout gridlayoutmanager android-recyclerview
我试图在回收者视图中使最后一行中心的项目水平.我正在使用GridLayoutManager以实现功能.使用setSpanSizeLookup,我想根据SO上的帖子调整最后一行的跨度大小,但遗憾的是我无法跟踪当前正在填充哪一行,因此我的逻辑无效.
我想要实现的是:
static private int NUM_OF_COLUMNS = 3;
final GridLayoutManager manager = new GridLayoutManager(getBaseActivity(), NUM_OF_COLUMNS);
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
int rowNum = 0;
@Override
public int getSpanSize(int position) {
int spanSize = 1;
if(position == 0)
rowNum = 0; //reset it
//check if it is last row
int numOfRows = (int) Math.ceil((double) list.size() / NUM_OF_COLUMNS);
if(rowNum == numOfRows - 1) {
//get num of items in last row
int items = list.size() - (NUM_OF_COLUMNS * rowNum); …Run Code Online (Sandbox Code Playgroud) 我需要创建一个水平滚动网格,可以分配不同宽度和不同高度的项目.StaggeredGridLayoutManager可以处理不同的宽度,但它不会让我有不同高度的项目.有没有LayoutManager可以做我需要的实现?
更新#1
添加了hasStableIds(true)并将Picasso更新到版本2.5.2.它没有解决问题.
再生产:
RecyclerView with GridLayoutManager(spanCount = 3).列表项是带有ImageView的CardViews.
当所有项目都不适合时,在一个项目上调用notifyItemChanged的屏幕会导致对onBindViewHolder()的多次调用.一个调用是来自notifyItemChanged其他人的位置,用于屏幕上不可见的项目.
问题:
有时,传递给notifyItemChanged的位置的项目加载了属于不在屏幕上的项目的图像(很可能是由于视图持有者的回收 - 尽管我会假设如果项目保留在原位,那么传递的视图持有者会是一样的).
我发现Jake在这里关于调用load()的其他问题的评论,即使文件/ uri为null.图像加载到每个onBindViewHolder上.
简单示例应用:
git clone https://github.com/gswierczynski/recycler-view-grid-layout-with-picasso.git
Run Code Online (Sandbox Code Playgroud)
点击一个项目调用notifyItemChanged,其参数等于该项目的位置.
码:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment())
.commit();
}
}
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
RecyclerView rv = (RecyclerView) rootView.findViewById(R.id.rv);
rv.setLayoutManager(new …Run Code Online (Sandbox Code Playgroud) 我有一个RecyclerView内部HorizontalScrollView,我希望它使用一个GridLayoutManager.这没关系,但有一件事还是困扰我,每列的宽度是相同的(根据我想的最大单元格宽度?).是否可以包装列的宽度以匹配此特定列的最大单元格?
它应该看起来像这样:
橙色部分是细胞视图所占据的部分.
编辑
我们让我澄清我的期望.一个例子比单词更好,在这里你可以看到一个带有GridLayoutManager的RecyclerView的截图.每个项目都是一个简单的TextView,随机包含10到40个字符之间的文本.如前所述,RecyclerView位于HorizontalScrollView内.我们可以看到每个列都具有相同的宽度,尽管此列中的任何项都不能满足整个宽度.我想要的是删除那些无用的空白空间和具有不同大小的列,每列与其自己的最大子项的宽度匹配.
如果你想测试这个行为,你可以克隆我在Github上传的这个repo:https://github.com/ShargotthDev/TestGrid
如上所述,这是我的XML布局(非常基本):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<HorizontalScrollView
android:id="@+id/gameplay_hotizontalScroll_ScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="70dp">
<android.support.v7.widget.RecyclerView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/recycler_view" />
</HorizontalScrollView>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
编辑2
我应该提到一些单元格的跨度大小可能超过1,而LayoutManager应该是垂直的,这样那些单元格可以在水平而不是垂直方向上占据更多位置(不知道我是否让自己理解).
谢谢你的时间 !
android gridlayoutmanager android-recyclerview android-wrap-content
我试图将所有项目水平放置在每一行中 RecyclerView
我尝试了很多东西:RelativeLayout作为父亲,然后使用layout_centerInParent,使用基本的android:layout_gravity ="center",尝试添加一些空间元素,使用权重和....
item_row.xml
但我没有成功:(
是)我有的

我想要的是

在活动中
recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
Run Code Online (Sandbox Code Playgroud)
item_row.xml
<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:id="@+id/cardView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
card_view:cardCornerRadius="2dp"
card_view:cardElevation="4dp"
card_view:cardUseCompatPadding="true">
<!-- Recycler View Item Row -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/imgThumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:background="@android:color/black" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="item name"
android:id="@+id/txtName"
android:layout_margin="5dp"
android:singleLine="false"
android:lines="2"
android:gravity="center" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:textAppearance="?android:attr/textAppearanceSmall"
android:id="@+id/txtCategory"
android:textStyle="italic"
android:textColor="#496fa9"
android:text="subtitle"
android:layout_weight="1"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:layout_gravity="center" />
<ImageButton
android:id="@+id/imageButton"
android:layout_width="48dp"
android:layout_height="wrap_content"
android:background="@android:color/black"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:padding="8dp"/> …Run Code Online (Sandbox Code Playgroud) android android-layout gridlayoutmanager android-recyclerview
版图设计:
HorizontalScrollView-parent, holding RV[
RecyclerView=>(GridLayoutManager) (orientation verticle)]
Run Code Online (Sandbox Code Playgroud)
哪个基本上会做双向滚动.此UI适用于电视.此网格中的焦点行将显示额外的细节,而其他行则不会.所以,每当有从一行的焦点变化到另一个onFocusChange我修改dataset的Adapter,并调用notifyItemRangeChanged().
当行长度超过屏幕的垂直长度,即垂直可滚动时,这可以正常工作.发生崩溃就像是行数较少(如4).
错误:
java.lang.IllegalArgumentException: parameter must be a descendant of this view
at android.view.ViewGroup.offsetRectBetweenParentAndChild(ViewGroup.java:5937)
at android.view.ViewGroup.offsetDescendantRectToMyCoords(ViewGroup.java:5866)
at android.widget.HorizontalScrollView.isWithinDeltaOfScreen(HorizontalScrollView.java:1168)
at android.widget.HorizontalScrollView.onSizeChanged(HorizontalScrollView.java:1569)
at android.view.View.sizeChange(View.java:19719)
at android.view.View.setFrame(View.java:19680)
at android.view.View.layout(View.java:19583)
at android.view.ViewGroup.layout(ViewGroup.java:6053)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1780)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1546)
at android.view.View.layout(View.java:19586)
at android.view.ViewGroup.layout(ViewGroup.java:6053)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
at android.view.View.layout(View.java:19586)
at android.view.ViewGroup.layout(ViewGroup.java:6053)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
at android.view.View.layout(View.java:19586)
at android.view.ViewGroup.layout(ViewGroup.java:6053)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080)
at android.view.View.layout(View.java:19586)
at android.view.ViewGroup.layout(ViewGroup.java:6053)
at …Run Code Online (Sandbox Code Playgroud) android horizontalscrollview gridlayoutmanager recycler-adapter android-recyclerview
我正在使用GridLayoutManager(GLM)我的RecyclerView.在RecyclerView,我将填充CardViews,如何设置我在整个屏幕中GLM只渲染一个CardView?
如果我将跨度大小设置为1,则CardView每行渲染一个,而不是整个屏幕.
在Simple中,我想显示1 CardView占用两列和两行.怎么做到这一点?
我想在网格中的项目之间创建一个空格.这些物品都应具有相同的宽度/高度.
我尝试过的:
创建一个GridLayoutOffsetDecorator将偏移量应用于所有网格项:
class GridLayoutOffsetDecorator(var offset: Int) : RecyclerView.ItemDecoration() {
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State?) {
super.getItemOffsets(outRect, view, parent, state)
outRect.set(offset, offset, offset, offset)
}
}
Run Code Online (Sandbox Code Playgroud)
具有偏移量8dp会16dp在项目之间创建空间.所以我们仍然需要8dp在外边缘应用填充:
<android.support.v7.widget.RecyclerView
android:id="@+id/productList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:padding="8dp" />
Run Code Online (Sandbox Code Playgroud)
结果是:
问题:项目大小不相同:
当您看到蓝线时,您会注意到高度略有不同.仅在填充Recyclerview之后才会出现此差异.这个填充似乎稍微调整了一些项目的大小.你们有这方面的经验吗?知道如何解决这个问题吗?
通过从项目中移除图像,高度差消失.这是图像的设置方式:
<SquareImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
app:imageResource="@{product.image}" />
Run Code Online (Sandbox Code Playgroud)
SquareImageView:
class SquareImageView : ImageView {
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
constructor(context: Context, attributeSet: …Run Code Online (Sandbox Code Playgroud) android android-gridlayout gridlayoutmanager android-recyclerview