RecyclerView滞后滚动

phl*_*_mk 19 android picasso android-recyclerview

我在RecyclerView中加载400x200图像,但在2k设备上滚动是滞后的.我正在使用Picasso从资源加载图像.

正如您在演示图像中看到的那样,在2k屏幕上模糊,但如果我加载更高分辨率的图像,情况会变得更糟.如何解决这个问题,我甚至没有加载大图像,它的400x200?

演示

这是我的代码 card_view.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:id="@+id/card_view"
    card_view:cardPreventCornerOverlap="false"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="8dp"
    card_view:cardCornerRadius="2dp">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:id="@+id/rel">

        <ImageView
            android:id="@+id/cardimage"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scaleType="fitXY"
            android:src="@drawable/p7"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="title"
            android:paddingLeft="16dp"
            android:paddingRight="16dp"
            android:paddingTop="16dp"
            android:paddingBottom="24dp"
            android:textStyle="bold"
            android:textSize="24sp"
            android:id="@+id/cardtitle"
            android:layout_gravity="center_vertical"/>

    </LinearLayout>

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

Myadapter代码

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> {

private Context mContext;
List<Flower> list = new ArrayList<>();

public CardAdapter(Context mContext, List<Flower> list) {
    this.mContext = mContext;
    this.list = list;

}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)   {

    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_view, parent, false);
    return new ViewHolder(itemView);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position)  {

    holder.Flower=getItem(position);
    holder.cardtitle.setText(list.get(position).name);

    Picasso.with(mContext)
            .load(list.get(position).id)
            .placeholder(R.drawable.ic_launcher)
            .into(holder.cardimage);
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

@Override
public int getItemCount() {
    return list.size();
}

public Flower getItem(int i) {
    return list.get(i);
}

public class ViewHolder extends RecyclerView.ViewHolder {

    ImageView cardimage;
    TextView cardtitle;
    Flower Flower;

    public ViewHolder(View itemView) {
        super(itemView);

        cardimage = (ImageView) itemView.findViewById(R.id.cardimage);
        cardtitle = (TextView) itemView.findViewById(R.id.cardtitle);
    }
}
}
Run Code Online (Sandbox Code Playgroud)

更新:我正在从资源加载图像,我没有下载任何东西

这是我的阵列

 private void initializeData() {
    flowers = new ArrayList<>();
    flowers.add(new Flower("Flower 1", R.drawable.p8));
    flowers.add(new Flower("Flower 2", R.drawable.p10));
    flowers.add(new Flower("Flower 3", R.drawable.p11));
    flowers.add(new Flower("Flower 4", R.drawable.p8));
    flowers.add(new Flower("Flower 5", R.drawable.photo2));
    flowers.add(new Flower("Flower 6", R.drawable.photo6));
    flowers.add(new Flower("Flower 7", R.drawable.p12));
    flowers.add(new Flower("Flower 8", R.drawable.p9));
    flowers.add(new Flower("Flower 9", R.drawable.p8));
    flowers.add(new Flower("Flower 10", R.drawable.p8));
    flowers.add(new Flower("Flower 11", R.drawable.p8));
    flowers.add(new Flower("Flower 12", R.drawable.p10));
}
Run Code Online (Sandbox Code Playgroud)

更新2:伙计我通过设置adapter.setHasStableIds(true)修复了大部分延迟,但是当第一次滚动时应用仍然滞后而图像尚未加载,如何修复?

更新3:我只是尝试从网络加载图像,一切看起来都很顺利,可能从资源加载图像有一些问题.

好的,谢谢你们,我要从网上加载我的图像.

Das*_*uni 20

如果您正在使用两个或更多的回收站视图(例如RecyclerView和NestedView),请尝试此操作

__CODE__

来源:嵌套Scrollview滚动内的Recyclerview,但不像普通的Recyclerview或Nested Scrollview那样快速滚动


And*_*des 11

RecyclerView.setHasFixedSize()设置为true吗?我无法重现这种滞后...你能把整个项目发布在git上吗?看看这个,也许它可以帮到你:http://antonioleiva.com/recyclerview/

  • 我正在使用genymotion vm,我似乎无法再现滞后.我有3个可能的改进:1.在activity_main.xml中,将RecyclerView.layout_height更改为"match_parent"2.尝试在drawable文件夹中仅使用png,因为它们可以更快地解压缩3.设置adapter.setHasStableIds(true); 并在CardAdapter中添加:`@Override public long getItemId(int position){return position; }` (3认同)

Ngu*_*Dat 8

我相信,有时你可能会激怒的时候只是想一些在绘制静态图像来显示你的回收站视图。而且它发生的时间非常滞后

为什么?你使用一些库从URL加载图像时可能得不到这个问题(毕加索,滑翔,...),但什么与发生相同的图像,大小一致,这是正确的在你的绘制(在不需要下载所有)。过了一会儿,我发现android做了一些技巧来调整可绘制图像的大小,以便我们在不同分辨率的设备上获得合适的图像。因此,我的建议使用drawable-nodpi存储您的图像,以使android不会干扰我们的图像。


Boo*_*ese 2

您需要异步获取图像。就像现在一样,它实际上无法下载图像。

创建图像视图时将其留空,但在下载图像时使用某种侦听器来设置图像。

  • 我没有下载图像,我正在从资源中设置图像。 (2认同)