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

时间:2016-07-06 12:29:38

标签: java android xml android-studio android-recyclerview

我刚刚为RecyclerView完成了Android Application,但在测试时,我发现了一个我不明白的奇怪错误。活动启动后,Recycler视图中的项目在RecyclerView中的距离正确。但是,一旦我开始滚动它们就会相互分开,直到一次只能看到一个项目,并且在看到下一个项目之前你必须将distance almost equivalent滚动到屏幕上。

这是bug的样子:

滚动活动午餐之前

enter image description here

滚动循环视图后

enter image description here

如果您知道可能导致此问题的原因,我们将非常感谢您的帮助。

以下是活动的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);
        }
    });

Recycler adapter:

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_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="15dp"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/content_product_detail_recycer_view_cur_image"
            android:layout_width="150dp"
            android:layout_height="130dp"
            android:layout_gravity="center"
            android:background="@android:color/black" />

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

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

    </LinearLayout>

recyclelerview内的项目布局:

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

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

1 个答案:

答案 0 :(得分:11)

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

好的,这就是问题所在:

  

对于版本2.3.0,LayoutManager API有一个令人兴奋的新功能:自动测量!   这允许RecyclerView根据其内容的大小调整自身大小。这意味着现在可以使用以前不可用的方案,例如使用WRAP_CONTENT作为RecyclerView的维度。   您会发现所有内置的LayoutManagers现在都支持自动测量。

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

基本上你需要删除LinearLayout

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

LinearLayout宽度中的match_parent使每个项目适合整个屏幕,包含一个图像和剩余空间。

如果您坚持使用LinearLayout,请将width和height设置为wrap_content