【发布时间】:2018-09-18 05:50:46
【问题描述】:
我有一个显示 YouTube 视频缩略图的 RecyclerView。我想在某些位置调用 notifyItemChanged() 方法时排除这些缩略图的刷新。
这是我的适配器:
public class VideosAdapter extends RecyclerView.Adapter<VideosAdapter.ViewHolder> {
private List<Video> videos;
private Animation loadingRotation;
public VideosAdapter(Context context, List<Video> videos) {
this.videos= videos;
loadingRotation = AnimationUtils.loadAnimation(context, R.anim.refresh_btn);
loadingRotation.setRepeatCount(Animation.INFINITE);
}
@NonNull
@Override
public VideosAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (parent instanceof RecyclerView) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
VideoItemLayoutBinding binding = DataBindingUtil.inflate(inflater, R.layout.video_item_layout,
parent, false);
ViewHolder holder = new ViewHolder(binding);
return holder;
} else {
throw new RuntimeException("Something is wrong with the RecyclerView");
}
}
@Override
public void onBindViewHolder(@NonNull VideosAdapter.ViewHolder holder, int position) {
//views that would update
//I want to exclude this:
holder.b.thumbnail.startAnimation(loadingRotation);
holder.b.thumbnail.initialize(YOUTUBE_API_KEY, new YouTubeThumbnailView.OnInitializedListener() {
@Override
public void onInitializationSuccess(YouTubeThumbnailView youTubeThumbnailView,
YouTubeThumbnailLoader youTubeThumbnailLoader) {
youTubeThumbnailLoader.setVideo(videos.get(position));
youTubeThumbnailLoader.setOnThumbnailLoadedListener(new YouTubeThumbnailLoader.OnThumbnailLoadedListener() {
@Override
public void onThumbnailLoaded(YouTubeThumbnailView youTubeThumbnailView, String s) {
youTubeThumbnailView.clearAnimation();
youTubeThumbnailView.setBackground(null);
youTubeThumbnailLoader.release();
}
@Override
public void onThumbnailError(YouTubeThumbnailView youTubeThumbnailView,
YouTubeThumbnailLoader.ErrorReason errorReason) {
youTubeThumbnailView.clearAnimation();
youTubeThumbnailLoader.release();
}
});
}
@Override
public void onInitializationFailure(YouTubeThumbnailView youTubeThumbnailView,
YouTubeInitializationResult youTubeInitializationResult) {
}
});
}
@Override
public int getItemCount() {
return ads.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
VideoItemLayoutBinding b;
ViewHolder(@NotNull VideoItemLayoutBinding binding) {
super(binding.getRoot());
this.b = binding;
}
}
}
video_item_layout.xml
中的缩略图声明 <com.google.android.youtube.player.YouTubeThumbnailView
android:id="@+id/thumbnail"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginBottom="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:background="@drawable/loading_thumbnail"
android:contentDescription="@string/video_thumbnail_description"/>
我使用了在加载缩略图时播放的动画(旋转进度条),并在缩略图准备好时停止。
我尝试将thumbnail.initialize() 放入onCreateViewHolder() 和ViewHolder() 构造函数中,但仍然没有,当我调用notifyItemChanged() 时,缩略图总是被重新加载。
提前谢谢你。
【问题讨论】:
-
你应该为你的列表对象添加一个布尔值,最初它会是假的,然后在你的缩略图加载后第一次它会是真的,然后你可以根据你的要求进行任何检查
-
@SahilKumar 不,那没用。这个想法似乎是正确的,但我认为
YoutubeThumbnailView本身存在问题。我找不到将视图锁定到加载的缩略图的方法。
标签: android thumbnails android-recyclerview android-youtube-api