0

RecyclerView에 표시된 영화 앞에 체크 표시가 있습니다. RecyclerView를 정렬 한 후 notifyDatasetChanged()을 사용하고 있습니다. 메뉴 옵션을 클릭하면 항목이 변경 되더라도 체크 표시는 변경되지 않고 같은 위치에 유지됩니다.RecyclerView를 정렬 한 후 notifyDatasetChanged()가 작동하지 않습니다.

여기 내 활동 클래스의 부분 :

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

어댑터는 모든 작업에 대한 책임이 있습니다. 어댑터 코드를 게시하십시오 –

+0

무엇에 응답입니까 : movies.add (response.body(). getMovies (order)); –

+0

@play_err_ Retrofit – RandomyzeEverything

답변

0

U가 movies.addAll을 (사용해야합니다) 대신 movies.add(). 그것의 명백한 당신은 API 응답에서 그 1 개 품목을 더 추가하기 때문에.

가 작동 어댑터 클래스에서 메소드를 생성하고 새 값을 전달하고 전화 notifyDatasetChanged을 그 메소드 내에서하지 않는 경우 :

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

및 adapter.notifyNewData (영화)를 호출; 당신의 메인 클래스에서

+0

'movies.addAll()'을 사용하고 있습니다. 복사 붙여 넣기에 실수를했습니다. 지금 내 코드 편집 중. – RandomyzeEverything

+0

내가 언급 한 다른 옵션을 시도해보십시오. –

+0

두 번째 옵션을 시도했지만 작동하지 않습니다. – RandomyzeEverything