Java 更新RecycleView中的CardView项目时遇到延迟

Java 更新RecycleView中的CardView项目时遇到延迟,java,android,android-recyclerview,lag,android-cardview,Java,Android,Android Recyclerview,Lag,Android Cardview,我在使用CardView时遇到问题。我创建了一个包含1个文本视图和2个图像视图的CardView,它显示在一个RecycleView中。当我尝试更新其中一个CardView的内容时(创建了5张用于测试的卡),当滚动更新的卡时,界面开始延迟,但当我传递项目时,界面会恢复正常。只有当存在ImageView时才会发生这种情况,当使用ImageView中的一些随机文本替换例如TextView时,它才能正常工作 现在,这是我的代码,在那之后,我将添加一些可能导致它的更多信息 首先是Adapter类,它还包

我在使用CardView时遇到问题。我创建了一个包含1个文本视图和2个图像视图的CardView,它显示在一个RecycleView中。当我尝试更新其中一个CardView的内容时(创建了5张用于测试的卡),当滚动更新的卡时,界面开始延迟,但当我传递项目时,界面会恢复正常。只有当存在ImageView时才会发生这种情况,当使用ImageView中的一些随机文本替换例如TextView时,它才能正常工作

现在,这是我的代码,在那之后,我将添加一些可能导致它的更多信息

首先是Adapter类,它还包含items类和List:

public class MovieDetailsAdapter extends RecyclerView.Adapter<MovieDetailsAdapter.MovieViewHolder> {

public List<MovieDetails> movieList;
private static final String TAG = "MyAdapter";

public MovieDetailsAdapter() {

    movieList = new ArrayList< MovieDetails>();
}




public void setItemCount(int count ,String title, Bitmap poster,Bitmap fanart ) {
    movieList.clear();
    movieList.addAll(generateDummyData(count, title, poster , fanart));

    notifyDataSetChanged();
}


@Override
public int getItemCount() {

    return movieList.size();
}


public void addItem(int position,String title, Bitmap poster, Bitmap fanart) {
   if (position > movieList.size()) return;

    movieList.add(position, generateDummyItem(title, poster, fanart));
   // notifyDataSetChanged();
    notifyItemInserted(position);
}

public void updateItem(int position, String title, Bitmap poster, Bitmap fanart) {
    if (position > movieList.size()) return;

    movieList.add(position, generateDummyItem(title, poster, fanart));
     notifyItemChanged(position);
  //  notifyDataSetChanged();
}


@Override
public MovieViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View itemView = LayoutInflater.
            from(viewGroup.getContext()).
            inflate(R.layout.card_layout_movies, viewGroup, false);
    Log.d(TAG, "create header view holder");
    return new MovieViewHolder(itemView);
}

@Override
public void onBindViewHolder(MovieViewHolder movieViewHolder, int i) {

    Log.d(TAG, "bind header view holder");
    MovieDetails mdet = movieList.get(i);

    movieViewHolder.vTitle.setText(mdet.Title);
    movieViewHolder.vPoster.setImageBitmap(mdet.imageViewPoster);
    movieViewHolder.vFanart.setImageBitmap(mdet.imageViewFanart);

    Log.d(TAG, "position: " + i + " holder: " + movieViewHolder + " text: " + movieViewHolder.vTitle);


}


public static class MovieViewHolder extends RecyclerView.ViewHolder {

    protected TextView vTitle;
    protected ImageView vPoster;
    protected ImageView vFanart;

    public MovieViewHolder(View v)
    {
        super(v);
        vTitle  = (TextView)  v.findViewById(R.id.title);
        vPoster = (ImageView) v.findViewById(R.id.imageViewPoster);
        vFanart = (ImageView) v.findViewById(R.id.imageViewFanart);

    }

}


public static class MovieDetails {

    protected String title;
    protected Bitmap imageViewPoster;
    protected Bitmap imageViewFanart;

    public MovieDetails(String title, Bitmap imageViewPoster,Bitmap imageViewFanart )
    {
        this.title = title;
        this.imageViewPoster = imageViewPoster;
        this.imageViewFanart = imageViewFanart;
    }
}

public static MovieDetails generateDummyItem(String title, Bitmap poster, Bitmap fanart) {

    MovieDetails mov = new MovieDetails(title, poster, fanart);
    return  mov;
}

public static List< MovieDetailsAdapter.MovieDetails> generateDummyData(int count, String title , Bitmap imageViewPoster, Bitmap imageviewFanart) {


    ArrayList<MovieDetailsAdapter.MovieDetails> items = new ArrayList<MovieDetailsAdapter.MovieDetails>();

    for (int i=0; i < count; i++) {

        items.add(new MovieDetailsAdapter.MovieDetails(title, imageViewPoster, imageviewFanart));
    }

    return items;
}
最后,我的CardView XML可能并不重要

<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:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
card_view:cardCornerRadius="4dp"
android:layout_margin="5dp">


<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="20dp"
        android:background="@color/bkg_card"
        android:text="Movie Title"
        android:gravity="center_vertical"
        android:textColor="@android:color/white"
        android:textSize="14dp"/>

    <ImageView
        android:elevation="5dp"
        android:scaleType="fitCenter"
        android:layout_width="100dp"
        android:layout_height="150dp"
        android:id="@+id/imageViewPoster"
        android:text="Poster"
        android:gravity="center_vertical"
        android:layout_below="@id/title"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="5dp"/>

    <ImageView
        android:id="@+id/imageViewFanart"
        android:scaleType="fitCenter"
        android:layout_alignBottom="@+id/imageViewPoster"
        android:layout_toEndOf="@+id/imageViewPoster"
        android:layout_width= "235dp"
        android:layout_height="122dp"
        android:layout_marginRight="5dp"/>


</RelativeLayout>

因此,我在适配器的onBind和onCreate方法中添加了日志项,以查看这是否是导致此问题的原因。事实上,这不仅仅是creating和一个额外的viewholder,还有3个viewholder。每次我滚动到最新更新的卡上,它似乎都在重新绑定,onBind方法似乎每次都会被调用

在我的例子中,按照线程中的解决方案将动画设置为“null”似乎没有任何效果,所以可能这不是导致它的原因


有什么想法吗?

嗯,我解决了。似乎只有当我通过XML方法加载图像时才会发生这种情况,如果我使用像毕加索这样的第三方库加载图像,这种延迟似乎消失了。比如:

Picasso.with(context).load(MovieDetails.getPoster())
            .error(R.drawable.placeholder)
            .placeholder(R.drawable.placeholder)
            .into(movieViewHolder.imageViewPoster);
在onBindViewHolder中
而不是传递位图,只需传递图像URL或位置的字符串。并将上下文传递给适配器类。

好吧,我解决了它。似乎只有当我通过XML方法加载图像时才会发生这种情况,如果我使用像毕加索这样的第三方库加载图像,这种延迟似乎消失了。比如:

Picasso.with(context).load(MovieDetails.getPoster())
            .error(R.drawable.placeholder)
            .placeholder(R.drawable.placeholder)
            .into(movieViewHolder.imageViewPoster);
在onBindViewHolder中 而不是传递位图,只需传递图像URL或位置的字符串。并将上下文传递给适配器类