简体   繁体   English

对回收站视图进行排序时出现问题 android studio

[英]Problem while sorting a recycler view android studio

I have a recycler that shows different movies and you are able to rate them.我有一个显示不同电影的回收站,您可以对它们进行评分。 Rating works ok but when hitting the sort button (that should arrange the movies from best to worst) everything just goes sort of nuts.评级工作正常,但是当点击排序按钮(应该从最好到最坏的顺序排列电影)时,一切都变得有点疯狂。 This is the movie class that has the sorting method:这是具有排序方法的电影类:

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

And this is the mainActivity where I call the method when the sort button is clicked:这是我在单击排序按钮时调用该方法的 mainActivity:

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

And here is the whole Adapter class which handles the recycler (without import statements)这是处理回收器的整个适配器类(没有导入语句)

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);
    }
}

} }

Try calling adapter's setMovies method after sorting the list.排序列表后尝试调用适配器的setMovies方法。

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

See there is this main recyclerview's recycling concept.看到有这个主要的recyclerview 的回收概念。 And that is your items' viewholders are interchangable.那就是您的项目的查看器是可以互换的。 For example viewholder1 is now pointing at video1, but when you call "notifyDataSetChanged", viewholder1 may point to video2.例如 viewholder1 现在指向 video1,但是当您调用“notifyDataSetChanged”时,viewholder1 可能指向 video2。

So here's what you should do;所以这就是你应该做的; you should keep each video's rating somewhere but not in viewholder (Because it recycles) and you should set the rating for each movie in "onBindViewHolder" method.您应该将每个视频的评分保留在某处,但不要保留在查看器中(因为它会回收),并且您应该在“onBindViewHolder”方法中为每部电影设置评分

For more info I suggest reading the recyclerview.有关更多信息,我建议阅读 recyclerview。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM