![](/img/trans.png)
[英]Android Studio SearchView filter in my app's Recycler View problem
[英]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.