0

我的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 {...} 

} 
+0

适配器负责所有工作。 post适配器代码 –

+0

什么是响应: movies.add(response.body()。getMovies(order)); –

+0

@play_err_我使用Retrofit – RandomyzeEverything

回答

0

ü应该使用movies.addAll()代替movies.add()。因为它明显地增加了来自api响应的一个项目。

如果没有从该法范围内工作,在你的适配器类创建方法,并传递新的值,然后致电notifyDatasetChanged:

public void notifyNewData(List<Movie> movies){ 
     this.movies.clear() 
     this.addAll(movies) 
     this.notifyDatasetChanged(); 
    } 

,并呼吁adapter.notifyNewData(电影);从您的主类

+0

我正在使用'movies.addAll()'。我在复制粘贴时犯了一个错误。现在编辑我的代码。 – RandomyzeEverything

+0

尝试我提到的其他选项,它应该工作 –

+0

我试过第二个选项,它不工作。 – RandomyzeEverything

相关问题