2015-04-05 12 views
7

Sto facendo una semplice panoramica con gli elementi del film. Quando provo ad aggiungere nuovi elementi, questi non verranno visualizzati subito nel recyclerview. Per qualche motivo devo scorrere verso il basso in modo che il primo elemento sia scomparso, e poi di nuovo in alto affinché il nuovo oggetto sia visualizzato (è aggiunto all'indice 0).RecyclerView aggiorna le voci solo quando si scorre verso il basso e verso l'alto

L'adattatore:

public class MovieCardAdapter extends RecyclerView.Adapter<MovieCardAdapter.MovieViewHolder> { 
List<Movie> movieList; 

public MovieCardAdapter(final List<Movie> movieList) { 
    this.movieList = movieList; 
} 

public void addItem(int position, final Movie movie){ 
    movieList.add(position,movie); 
    notifyItemInserted(position); 
} 

public void removeItem(final Movie movie){ 
    final int indexOf = movieList.indexOf(movie); 
    movieList.remove(movie); 
    notifyItemRemoved(indexOf); 
} 

public void updateItems(final List<Movie> items){ 
    movieList = items; 
    notifyDataSetChanged(); 
} 

@Override 
public MovieViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View itemView = LayoutInflater. 
      from(viewGroup.getContext()). 
      inflate(R.layout.movie_row, viewGroup, false); 

    return new MovieViewHolder(itemView); 
} 

@Override 
public long getItemId(int position) { 
    return super.getItemId(position); 
} 

@Override 
public void onBindViewHolder(final MovieViewHolder movieViewHolder, final int i) { 
    final Movie movie = movieList.get(i); 

    String posterUrl = ""; 
    final int posterHeight = 240; 
    if (!isEmpty(movie.getImdb_id())) { 
     posterUrl = "http://img.omdbapi.com/?i=" + movie.getImdb_id() + "&apikey="+apiKey+"&h=" + posterHeight; 
    } else if (!isEmpty(movie.getPoster())) { 
     posterUrl = movie.getPoster(); 
    } 
    if (!isEmpty(posterUrl)) { 
     Picasso.with(movieViewHolder.context) 
       .load(posterUrl) 
       .resize(220, 354) 
       .centerCrop() 
       .into(movieViewHolder.poster); 
    } 

    movieViewHolder.title.setText(movie.getTittel()); 
    movieViewHolder.format.setText(movie.getFormat()); 

    if (movie.getRuntime().isEmpty() || movie.getRuntime().equalsIgnoreCase("0")){ 
     movieViewHolder.runtime.setText(""); 
    }else{ 
     movieViewHolder.runtime.setText(movie.getRuntime()+" mins"); 
    } 

    if (!movie.getTagline().isEmpty()) { 
     movieViewHolder.tagline.setText(movie.getTagline()); 
    } else if (!movie.getPlot().isEmpty()) { 
     movieViewHolder.tagline.setText(movie.getPlot()); 
    } 
} 

@Override 
public int getItemCount() { 
    return movieList.size(); 
} 

public static class MovieViewHolder extends RecyclerView.ViewHolder { 
    protected Context context; 
    protected LinearLayout movieRowLinearLayout; 
    protected ImageView poster; 
    protected TextView title; 
    protected TextView runtime; 
    protected TextView tagline; 
    protected TextView format; 

    public MovieViewHolder(View v) { 
     super(v); 
     context = v.getContext(); 
     movieRowLinearLayout = (LinearLayout) v.findViewById(R.id.movieRowLinearLayout); 
     poster = (ImageView) v.findViewById(R.id.poster); 
     title = (TextView) v.findViewById(R.id.title); 
     runtime = (TextView) v.findViewById(R.id.runtime); 
     tagline = (TextView) v.findViewById(R.id.tagline); 
     format = (TextView) v.findViewById(R.id.format); 
    } 
} 

}

inizializzazione della scheda:

adapter = new MovieCardAdapter(MovieList.movies); 
recyclerView.setAdapter(adapter); 

Aggiungere un filmato di esempio:

if (id == R.id.add_movie) { 
     final Movie movie = new Movie(); 
     movie.setTittel("0TEST"); 
     movie.setFormat("HD-DVD"); 

     MovieList.sortMoviesByTitle(); 
     adapter.addItem(MovieList.movies.indexOf(movie), movie); 
     return true; 
    } else if (id == R.id.action_logOut) { 
     logOut(this); 
    } 

Sry cattivo inglese, spero che qualcuno capisce e sapere cosa il problema potrebbe essere. Ho provato ad aggiungere da runOnUiThread ([...]), ma lo stesso risultato.

risposta

2

Ciò accade perché la posizione 0 è al di sopra della schermata visibile corrente. Fino a quando non viene implementata la modalità di trascrizione, quando si aggiunge un articolo alla posizione N, provare a chiamare scrollToPosition(N) se LinearLayoutManager#findFirstCompletelyVisibleItemPosition restituisce N.

Inoltre, non impostare il parametro di posizione final nel metodo onBindViewHolder. Utilizzare invece ViewHolder.getPosition() se necessario in una richiamata. Quando cambia la posizione dell'elemento, non riceverai una chiamata onBind a meno che l'elemento stesso non venga invalidato.

Aggiornamento

anche la logica di aggiornamento non è corretto perché non sta cancellando i valori in vista.

if (!movie.getTagline().isEmpty()) { 
    movieViewHolder.tagline.setText(movie.getTagline()); 
} else if (!movie.getPlot().isEmpty()) { 
    movieViewHolder.tagline.setText(movie.getPlot()); 
} else { 
    movieViewHolder.tagline.setText(null); 
} 

Uguale all'URL del poster.

+0

provato, ma l'elemento aggiunto non è "in primo piano" della recyclerView. È innanzitutto quando i primi elementi vengono "riciclati" e diventano visibili. Ho provato il debug e vedo che l'elemento è stato aggiunto alla lista nell'adattatore. –

+0

Hmm, ha aggiornato la risposta con un altro problema nel codice. Se è ancora rotto, non esitate a inviarmi un'app o creare un bug report su b.android.com con un'app campione. – yigit

+0

Ho aperto il progetto av https://github.com/olavbg/MyMoovs Ma funziona in corso, con molte cose che potrebbero/dovrebbero essere migliori. –

0

L'aggiunta di questo risolto il problema per me

layoutManager.scrollToPosition 
Problemi correlati