簡體   English   中英

對回收站視圖進行排序時出現問題 android studio

[英]Problem while sorting a recycler view android studio

我有一個顯示不同電影的回收站,您可以對它們進行評分。 評級工作正常,但是當點擊排序按鈕(應該從最好到最壞的順序排列電影)時,一切都變得有點瘋狂。 這是具有排序方法的電影類:

public static Comparator<Movie> MovieComparator = new Comparator<Movie>() {
    @Override
    public int compare(Movie m1, Movie m2) {
        return m1.getStars() - m2.getStars();
    }
};

這是我在單擊排序按鈕時調用該方法的 mainActivity:

sortButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Collections.sort(movies, Movie.MovieComparator);
            adapter.notifyDataSetChanged();
        }
    });

這是處理回收器的整個適配器類(沒有導入語句)

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

private ArrayList<Movie> movies = new ArrayList<>();
private Context context;

public MoviesRecViewAdapter(Context context) {
    this.context = context;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.movies_list_item, parent, false);
    ViewHolder holder = new ViewHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    holder.movie_title.setText(movies.get(position).getTitle());
    holder.movie_duration.setText(movies.get(position).getDuration() + " min");
    Uri uri = Uri.parse(movies.get(position).getImg());
    holder.movie_img.setImageURI(uri);
    holder.rating_bar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
        @Override
        public void onRatingChanged(RatingBar ratingBar, float v, boolean b) {
            int rating = (int) v;
            movies.get(holder.getAdapterPosition()).setStars(rating);
            Toast.makeText(holder.itemView.getContext(), "Your rating was submitted", Toast.LENGTH_SHORT).show();
        }
    });

}

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

public void setMovies(ArrayList<Movie> movies) {
    this.movies = movies;
    notifyDataSetChanged();
}

public class ViewHolder extends RecyclerView.ViewHolder {

    private TextView movie_title;
    private TextView movie_duration;
    private ImageView movie_img;
    private RelativeLayout parent;
    private RatingBar rating_bar;
    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        movie_title = itemView.findViewById(R.id.movie_title);
        movie_duration = itemView.findViewById(R.id.movie_duration);
        movie_img = itemView.findViewById(R.id.movie_img);
        parent = itemView.findViewById(R.id.parent);
        rating_bar = itemView.findViewById(R.id.rating_bar);
    }
}

}

排序列表后嘗試調用適配器的setMovies方法。

sortButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Collections.sort(movies, Movie.MovieComparator);
            adapter.setMovies(movies);
        }
    });

看到有這個主要的recyclerview 的回收概念。 那就是您的項目的查看器是可以互換的。 例如 viewholder1 現在指向 video1,但是當您調用“notifyDataSetChanged”時,viewholder1 可能指向 video2。

所以這就是你應該做的; 您應該將每個視頻的評分保留在某處,但不要保留在查看器中(因為它會回收),並且您應該在“onBindViewHolder”方法中為每部電影設置評分

有關更多信息,我建議閱讀 recyclerview。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM