gpt4 book ai didi

android - RecyclerView 仅在向下和向上滚动时刷新项目

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:58:09 25 4
gpt4 key购买 nike

我正在用电影项目制作一个简单的回收 View 。当我尝试添加新项目时,它们不会立即显示在回收站 View 中。出于某种原因,我必须向下滚动以便第一个项目消失,然后再次向上滚动以显示新项目(它添加在索引 0 处)。

适配器:

public class MovieCardAdapter extends RecyclerView.Adapter<MovieCardAdapter.MovieViewHolder> {
List<Movie> movieList;

public MovieCardAdapter(final List<Movie> movieList) {
this.movieList = movieList;
}

public void addItem(int position, final Movie movie){
movieList.add(position,movie);
notifyItemInserted(position);
}

public void removeItem(final Movie movie){
final int indexOf = movieList.indexOf(movie);
movieList.remove(movie);
notifyItemRemoved(indexOf);
}

public void updateItems(final List<Movie> items){
movieList = items;
notifyDataSetChanged();
}

@Override
public MovieViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.movie_row, viewGroup, false);

return new MovieViewHolder(itemView);
}

@Override
public long getItemId(int position) {
return super.getItemId(position);
}

@Override
public void onBindViewHolder(final MovieViewHolder movieViewHolder, final int i) {
final Movie movie = movieList.get(i);

String posterUrl = "";
final int posterHeight = 240;
if (!isEmpty(movie.getImdb_id())) {
posterUrl = "http://img.omdbapi.com/?i=" + movie.getImdb_id() + "&apikey="+apiKey+"&h=" + posterHeight;
} else if (!isEmpty(movie.getPoster())) {
posterUrl = movie.getPoster();
}
if (!isEmpty(posterUrl)) {
Picasso.with(movieViewHolder.context)
.load(posterUrl)
.resize(220, 354)
.centerCrop()
.into(movieViewHolder.poster);
}

movieViewHolder.title.setText(movie.getTittel());
movieViewHolder.format.setText(movie.getFormat());

if (movie.getRuntime().isEmpty() || movie.getRuntime().equalsIgnoreCase("0")){
movieViewHolder.runtime.setText("");
}else{
movieViewHolder.runtime.setText(movie.getRuntime()+" mins");
}

if (!movie.getTagline().isEmpty()) {
movieViewHolder.tagline.setText(movie.getTagline());
} else if (!movie.getPlot().isEmpty()) {
movieViewHolder.tagline.setText(movie.getPlot());
}
}

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

public static class MovieViewHolder extends RecyclerView.ViewHolder {
protected Context context;
protected LinearLayout movieRowLinearLayout;
protected ImageView poster;
protected TextView title;
protected TextView runtime;
protected TextView tagline;
protected TextView format;

public MovieViewHolder(View v) {
super(v);
context = v.getContext();
movieRowLinearLayout = (LinearLayout) v.findViewById(R.id.movieRowLinearLayout);
poster = (ImageView) v.findViewById(R.id.poster);
title = (TextView) v.findViewById(R.id.title);
runtime = (TextView) v.findViewById(R.id.runtime);
tagline = (TextView) v.findViewById(R.id.tagline);
format = (TextView) v.findViewById(R.id.format);
}
}

初始化适配器:

adapter = new MovieCardAdapter(MovieList.movies);
recyclerView.setAdapter(adapter);

添加示例电影:

if (id == R.id.add_movie) {
final Movie movie = new Movie();
movie.setTittel("0TEST");
movie.setFormat("HD-DVD");

MovieList.sortMoviesByTitle();
adapter.addItem(MovieList.movies.indexOf(movie), movie);
return true;
} else if (id == R.id.action_logOut) {
logOut(this);
}

对不起英语不好,希望有人理解并知道问题可能是什么。我尝试从 runOnUiThread([...]) 添加,但结果相同。

最佳答案

发生这种情况是因为位置 0 位于当前可见屏幕上方。在实现转录模式之前,当您将项目添加到位置 N 时,如果 LinearLayoutManager#findFirstCompletelyVisibleItemPosition 返回 ,请尝试调用 scrollToPosition(N) >N.

此外,不要在 onBindViewHolder 方法中将位置参数设为 final。相反,如果您需要在回调中使用 ViewHolder.getPosition()。当项目的位置发生变化时,除非项目本身失效,否则您不会收到 onBind 调用。

更新

您的更新逻辑也不正确,因为您没有清除 View 中的值。

if (!movie.getTagline().isEmpty()) {
movieViewHolder.tagline.setText(movie.getTagline());
} else if (!movie.getPlot().isEmpty()) {
movieViewHolder.tagline.setText(movie.getPlot());
} else {
movieViewHolder.tagline.setText(null);
}

海报 URL 相同。

关于android - RecyclerView 仅在向下和向上滚动时刷新项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29460164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com