notifyDatasetChanged()在排序后不工作RecyclerView
我的RecyclerView在看到的电影前面包含复选标记。排序我的RecyclerView后我使用notifyDatasetChanged()
。点击菜单选项后,即使项目正在更改,复选标记也不会更改并保持在同一位置。notifyDatasetChanged()在排序后不工作RecyclerView
这里是我的活动课的一部分:
public class SearchActivity extends AppCompatActivity {
MoviesAdapter adapter;
List<Movie> movies = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adapter = new MovieAdapter(movies, SearchActivity.this);
recyclerView.setAdapter(adapter);
fetchMovies("ascending");
}
private void fetchMovies(String order) {
movies.clear();
movies.addAll(response.body().getMovies(order));
adapter.notifyDatasetChanged();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.ascending:
fetchMovies("ascending");
adapter.notifyDatasetChanged();
return true;
case R.id.descending:
fetchMovies("descending");
adapter.notifyDatasetChanged();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
我MovieAdapter
:
public class MovieAdapter extends RecyclerView.Adapter<MovieAdapter.MovieViewHolder> {
private List<Movie> movies;
private final int rowLayout;
private final Context context;
public MovieAdapter(List<Movie> movies, Context context) {
this.movies= movies;
this.rowLayout = R.layout.movie_item;
this.context = context;
}
@Override
public MovieViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(rowLayout, parent, false);
return new MovieViewHolder(view);
}
@Override
public void onBindViewHolder(final MovieViewHolder holder, @SuppressLint("RecyclerView") final int position) {...}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public int getItemCount() {
return movies.size();
}
public void notifyNewData(List<Movie> movies) {
this.movies= movies;
notifyDataSetChanged();
}
static class MovieViewHolder extends RecyclerView.ViewHolder {...}
}
ü应该使用movies.addAll()代替movies.add()。因为它明显地增加了来自api响应的一个项目。
如果没有从该法范围内工作,在你的适配器类创建方法,并传递新的值,然后致电notifyDatasetChanged:
public void notifyNewData(List<Movie> movies){
this.movies.clear()
this.addAll(movies)
this.notifyDatasetChanged();
}
,并呼吁adapter.notifyNewData(电影);从您的主类
我正在使用'movies.addAll()'。我在复制粘贴时犯了一个错误。现在编辑我的代码。 – RandomyzeEverything
尝试我提到的其他选项,它应该工作 –
我试过第二个选项,它不工作。 – RandomyzeEverything
适配器负责所有工作。 post适配器代码 –
什么是响应: movies.add(response.body()。getMovies(order)); –
@play_err_我使用Retrofit – RandomyzeEverything