0

Mein RecyclerView enthält Häkchen vor den Filmen, die gesehen werden. Ich benutze notifyDatasetChanged() nach dem Sortieren meiner RecyclerView. Nach dem Klicken auf die Menüoptionen ändern sich die Häkchen nicht, auch wenn sich die Elemente ändern. Sie bleiben am selben Ort.notifyDatasetChanged() funktioniert nicht nach dem Sortieren RecyclerView

Hier ist ein Teil meiner Tätigkeit Klasse:

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

Mein 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

Adapter ist verantwortlich für alle Arbeiten. Post Adapter Code –

+0

Was ist die Antwort in: movies.add (response.body(). GetMovies (Reihenfolge)); –

+0

@play_err_ Ich hole Filme von einer API mit Retrofit – RandomyzeEverything

Antwort

0

U sollte movies.addAll() verwenden, statt movies.add(). Weil es offensichtlich ist, dass Sie mehr als einen Gegenstand aus der API-Antwort hinzufügen.

Wenn es nicht funktioniert, eine Methode in der Adapter-Klasse erstellen und die neuen Werte an sie übergeben und rufen notifyDatasetChanged aus dieser Methode:

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

und rufen adapter.notifyNewData (Filme); von Ihrer Hauptklasse

+0

Ich verwende 'movies.addAll()'. Ich habe einen Fehler beim Kopieren gemacht. Bearbeiten Sie meinen Code jetzt. – RandomyzeEverything

+0

versuchen Sie die andere Option, die ich erwähnte, und es sollte funktionieren –

+0

Ich habe die zweite Option versucht, es funktioniert nicht. – RandomyzeEverything

Verwandte Themen