滚动时扩展项目之间的 RecyclerView 空间

Posted

技术标签:

【中文标题】滚动时扩展项目之间的 RecyclerView 空间【英文标题】:RecyclerView space between items expanding when scrolling 【发布时间】:2016-11-08 12:10:07 【问题描述】:

我刚刚为我的android Application 完成了我的RecyclerView,但是在测试它时,我发现了一个我不明白的奇怪错误。当活动启动时,Recycler 视图中的项目以正确的距离很好地定位在RecyclerView 中。但是,一旦我开始滚动,它们就会彼此分开,直到一次只能看到一个项目,并且您必须将 distance almost equivalent 滚动到屏幕上才能看到下一个项目。

这是错误的样子:

在活动午餐上滚动之前

滚动回收视图后

如果您知道可能导致此问题的原因,我们将不胜感激。

这是活动中的 RecyclerView 代码:

private ArrayList<String> imagesUrlListThumb, imagesUrlListFull = new ArrayList<String>();
private RecyclerAdapter recyclerAdapter;
private String urlRecyclerThumb = "";
private RecyclerView recyclerView;
private ImageView imgCurRecyclerView;

    imagesUrlListThumb = produit.getImgUrlThumbMul();
    recyclerAdapter = new RecyclerAdapter(getApplicationContext(), imagesUrlListThumb);
    recyclerView = (RecyclerView) findViewById(R.id.content_product_detail_recycer_view);
    RecyclerView.LayoutManager recyclerLayoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false);
    recyclerView.setLayoutManager(recyclerLayoutManager);
    recyclerView.setAdapter(recyclerAdapter);
    urlRecyclerThumb = imagesUrlListThumb.get(0);
    RecyclerItemClickSupport.addTo(recyclerView).setOnItemClickListener(new RecyclerItemClickSupport.OnItemClickListener() 
        @Override
        public void onItemClicked(RecyclerView rv, int pos, View view) 
            urlRecyclerThumb = imagesUrlListThumb.get(pos);
            Picasso.with(getApplicationContext()).load(urlRecyclerThumb).fit().into(imgCurRecyclerView);
        
    );

回收器适配器:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder>

private List<String> urlThumbImg;
private Context context;

public RecyclerAdapter(Context ctx, List<String> urls)
    this.urlThumbImg = urls;
    this.context = ctx;


@Override
public RecyclerAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_slideshow, parent, false);
    return new MyViewHolder(itemView);


@Override
public void onBindViewHolder(RecyclerAdapter.MyViewHolder holder, int position)
    String current = urlThumbImg.get(position);
    Picasso.with(context).load(current).fit().into(holder.myImgView);


@Override
public int getItemCount()
    return urlThumbImg.size();


public class MyViewHolder extends RecyclerView.ViewHolder 
    public ImageView myImgView;

    public MyViewHolder(View view)
        super(view);
        myImgView = (ImageView) view.findViewById(R.id.imageView_slide);
    


这是我关于回收站视图的 xml 布局:

<!-- RECYCLER VIEW -->
    <LinearLayout
        android:layout_
        android:layout_
        android:layout_marginTop="15dp"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/content_product_detail_recycer_view_cur_image"
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:background="@android:color/black" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/content_product_detail_recycer_view"
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:layout_margin="5dp"
            android:background="@android:color/darker_gray">

        </android.support.v7.widget.RecyclerView>

    </LinearLayout>

recyclerview 中项目的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_>

<ImageView
    android:id="@+id/imageView_slide"
    android:layout_
    android:layout_
    android:layout_margin="5dp"
    android:background="@android:color/darker_gray" />

【问题讨论】:

你的回收站查看代码? 为您在recyclerview中的项目提供布局和recyclerview代码 @AhmadAlsanie 我已经添加了我的问题的代码 @Kushan 我已经添加了我的问题的代码 @Adamouization RecyclerView buddy 中项目的布局。 【参考方案1】:

提供您的 Layout 和 RecyclerView 代码以帮助调试而不是猜测。

好的,问题来了:

在 2.3.0 版中,LayoutManager API 有了一个令人兴奋的新功能:自动测量! 这允许 RecyclerView 根据其内容的大小来调整自己的大小。这意味着以前不可用的场景,例如将 WRAP_CONTENT 用于 RecyclerView 的维度,现在是可能的。 您会发现所有内置的 LayoutManagers 现在都支持自动测量。

由于此更改,请务必仔细检查项目视图的布局参数:以前忽略的布局参数(例如滚动方向中的 MATCH_PARENT)现在将得到完全尊重。

基本上你需要去掉LinearLayout

<ImageView
android:id="@+id/imageView_slide"
android:layout_
android:layout_
android:layout_margin="5dp"
android:background="@android:color/darker_gray" />

LinearLayout 宽度中的 match_parent 导致每个项目用一个图像和剩余空间来适应整个屏幕。

如果您坚持使用LinearLayout,请将宽度和高度都设置为wrap_content

【讨论】:

src: ***.com/questions/35728179/… 感谢@Ahmad Alsanie :) 忘记添加报价来源 :)

以上是关于滚动时扩展项目之间的 RecyclerView 空间的主要内容,如果未能解决你的问题,请参考以下文章

向下滚动时 RecyclerView 项目之间的间隙较大

向下滚动然后再次向上滚动后,recyclerview 项目之间出现间隙。请看详情

为啥直到在选项卡之间滚动才会显示 recyclerview 项目?

RecyclerView 自动滚动到 WebView/Fresco SimpleDraweeView 项

使用导航组件保存 RecyclerView 的滚动

单击项目Android时RecyclerView滚动