Aggiunta di elementi a Endless Scroll RecyclerView con ProgressBar in basso

Ho seguito l'eccellente risposta di Vilen su SO: metta una barra di progresso indeterminata come piè di pagina in una griglia RecyclerView su come implementare un riciclaggio senza fine di scorrimento con ProgressBar.

Ho implementato io stesso e funziona, ma vorrei estendere l'esempio. Voglio aggiungere elementi in cima al recyclerview, simile a come Facebook lo fa quando si aggiunge un nuovo aggiornamento dello stato.

  • Alternativa per aggiungerePreferenzeFromResource come deprecata
  • Errore durante il recupero del genitore per elemento: nessuna risorsa trovata che corrisponde al nome specificato dopo l'aggiornamento a AppCompat v23
  • Come importre o inserire i contatti dal file .vcf in Android in modo programmato?
  • Perché l'adb restituisce offline dopo la string di periferica?
  • Il webview loadurl di Android ("file: ///android_asset/index.html#home") non è riuscito
  • Preferenza condivisa per la window di dialogo di avviso rende la mia applicazione non retriggers
  • Non sono riuscito a aggiungere elementi in più nell'elenco – ecco il mio codice che ho aggiunto sul codice di Vilen nella sua MainActivity:

    @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.add) { myDataset.add(0, "Newly added"); mRecyclerView.smoothScrollToPosition(0); mAdapter.notifyItemInserted(0); } return super.onOptionsItemSelected(item); } 

    Quando ho cliccato sul button "Aggiungi":

    Aggiunta di un nuovo elemento

    Quando scorri verso il basso, ho due spinner invece di uno:

    Scorri verso il basso

    Quando finiscono i filatori e vengono caricati i prossimi 5 articoli, il filatore è ancora presente:

    dopo il filatore

    Che cosa sto facendo di sbagliato?

  • Come facciamo a distinguere non-interrogato da Stop-Asking nelle autorizzazioni di runtime di Android M?
  • Android: ha chiamato CalledFromWrongThreadException in onPostExecute () - Come potrebbe essere?
  • Gestione dei cambiamenti di orientamento con i frammenti
  • OpenID per applicazioni Android che richiedono SignIn
  • Compilare libpcap usando Android NDK
  • Perché avviare un'attività da un widget causa la mia attività principale?
  • 2 Solutions collect form web for “Aggiunta di elementi a Endless Scroll RecyclerView con ProgressBar in basso”

    Il problema è che quando si aggiunge il nuovo elemento interno, EndlessRecyclerOnScrollListener non lo sa e i contatori si rompono. In realtà la risposta con EndlessRecyclerOnScrollListener ha alcune limitazioni e possibili problemi, ad esempio se si carica un elemento alla volta, non funziona. Ecco una versione avanzata.

    1. Sbarazzati di EndlessRecyclerOnScrollListener non abbiamo più bisogno
    2. Cambiare l'adattatore su questo che contiene l'ascolto di scorrimento

       public class MyAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private final int VIEW_ITEM = 1; private final int VIEW_PROG = 0; private List<T> mDataset; // The minimum amount of items to have below your current scroll position before loading more. private int visibleThreshold = 2; private int lastVisibleItem, totalItemCount; private boolean loading; private OnLoadMoreListener onLoadMoreListener; public MyAdapter(List<T> myDataSet, RecyclerView recyclerView) { mDataset = myDataSet; if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) { final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); totalItemCount = linearLayoutManager.getItemCount(); lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition(); if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) { // End has been reached // Do something if (onLoadMoreListener != null) { onLoadMoreListener.onLoadMore(); } loading = true; } } }); } } @Override public int getItemViewType(int position) { return mDataset.get(position) != null ? VIEW_ITEM : VIEW_PROG; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder vh; if (viewType == VIEW_ITEM) { View v = LayoutInflater.from(parent.getContext()) .inflate(android.R.layout.simple_list_item_1, parent, false); vh = new TextViewHolder(v); } else { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.progress_item, parent, false); vh = new ProgressViewHolder(v); } return vh; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof TextViewHolder) { ((TextViewHolder) holder).mTextView.setText(mDataset.get(position).toString()); } else { ((ProgressViewHolder) holder).progressBar.setIndeterminate(true); } } public void setLoaded() { loading = false; } @Override public int getItemCount() { return mDataset.size(); } public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) { this.onLoadMoreListener = onLoadMoreListener; } public interface OnLoadMoreListener { void onLoadMore(); } public static class TextViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; public TextViewHolder(View v) { super(v); mTextView = (TextView) v.findViewById(android.R.id.text1); } } public static class ProgressViewHolder extends RecyclerView.ViewHolder { public ProgressBar progressBar; public ProgressViewHolder(View v) { super(v); progressBar = (ProgressBar) v.findViewById(R.id.progressBar); } } } 
    3. Modifica codice nella class Attività

       mAdapter = new MyAdapter<String>(myDataset, mRecyclerView); mRecyclerView.setAdapter(mAdapter); mAdapter.setOnLoadMoreListener(new MyAdapter.OnLoadMoreListener() { @Override public void onLoadMore() { //add progress item myDataset.add(null); mAdapter.notifyItemInserted(myDataset.size() - 1); handler.postDelayed(new Runnable() { @Override public void run() { //remove progress item myDataset.remove(myDataset.size() - 1); mAdapter.notifyItemRemoved(myDataset.size()); //add items one by one for (int i = 0; i < 15; i++) { myDataset.add("Item" + (myDataset.size() + 1)); mAdapter.notifyItemInserted(myDataset.size()); } mAdapter.setLoaded(); //or you can add all at once but do not forget to call mAdapter.notifyDataSetChanged(); } }, 2000); System.out.println("load"); } }); 

    Il resto rimane invariato, fa sapere se questo funziona per te.

    Credo di aver capito.

    Ho dimenticato di call notifyItemRangeChanged.

     @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.add) { myDataset.add(0, "Newly added"); mAdapter.notifyItemInserted(0); mAdapter.notifyItemRangeChanged(1, myDataset.size()); mRecyclerView.smoothScrollToPosition(0); } return super.onOptionsItemSelected(item); } 

    Una volta aggiunto, il codice funziona, tuttavia, vedrai che dopo che il filatore finisce di filatura, il numero di articolo non verrà incrementato correttamente.

    incremento

    Ciò è dovuto al fatto che l'elemento "Newly added" in alto conta come elemento effettivo (possiamo chiamarlo "Item 0") e questo causa l'innalzamento di incremento di 1 come 21, ma in realtà il numero 21 è diventato l'elemento 0 In altre parole, ci sono 21 elementi reali prima dell'articolo 22.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.