Eliminar elementos de RecyclerView

Tengo un RecyclerView que está agregando artículos cada cierto período. Al agregar objetos, si los elementos de la lista son más de (digamos) 500, a continuación, los primeros elementos se eliminarán y los nuevos elementos se agregarán.

¡Si el RecyclerView no puede desplazarse hacia abajo !recyclerView.canScrollVertically(1); RecyclerView.canScrollVertically !recyclerView.canScrollVertically(1); Luego, después de añadir nuevos elementos, el RecyclerView smoothScroolToPosition() hasta la última posición.

¿Dónde está el problema? Bueno, si ReyclerView está en el centro (no en la parte inferior, no en la parte superior) al eliminar elementos antiguos, de repente saltará algunas posiciones hacia arriba. Quiero que el RecyclerView para no saltar la posición y permanecer donde estaba cuando la eliminación de elementos en la parte superior

He intentado usar layoutManager.setStackFromEnd(true); Pero no hay suerte

¿Alguna sugerencia?

Algún código (código no relacionado se elimina). Mi problema se puede reproducir cuando el RecyclerView está mostrando los elementos de la lista desde el centro y pulse VOLUME_UP:

 public class ActivityMain extends ActionBarActivity { public static final int MAX_LOG_ITEMS = 500; private RecyclerView mRecyclerView; private AdapterLog mRecyclerAdapter; private boolean mAutoScroll = true; private DataReceiver mDataReceiver; private Handler mLogHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what){ case DataReceiver.CAT_LOGS: List<Log> catLogs = (List<Log>) msg.obj; updateLogs(catLogs); break; case DataReceiver .CLEAR_LOGS: if (mRecyclerAdapter.getItemCount() > MAX_LOG_ITEMS) mRecyclerAdapter.removeFirstItems(mRecyclerAdapter.getItemCount() - MAX_LOG_ITEMS); break; case Logcat.REMOVE_LOGS: mRecyclerAdapter.clear(); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setStackFromEnd(true); mRecyclerAdapter = new AdapterLog(); mRecyclerView = (RecyclerView) findViewById(R.id.activity_main_recyclerview); mRecyclerView.setHasFixedSize(true); mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setAdapter(mRecyclerAdapter); mRecyclerView.setOnScrollListener(new UIUtils.ScrollManager(toolbarContainer != null ? toolbarContainer : toolbar){ @Override public void onScrolled(RecyclerView r, int dx, int dy) { super.onScrolled(r, dx, dy); mAutoScroll = !r.canScrollVertically(1); } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch(keyCode){ case KeyEvent.KEYCODE_VOLUME_UP: // mAutoScroll = false; // mRecyclerView.scrollToPosition(0); // if (mRecyclerAdapter.getItemCount() > MAX_LOG_ITEMS) mRecyclerAdapter.removeFirstItems(mRecyclerAdapter.getItemCount() - 50); return true; case KeyEvent.KEYCODE_VOLUME_DOWN: mAutoScroll = true; mRecyclerView.scrollToPosition(mRecyclerAdapter.getItemCount() -1); return true; } return false; } private void updateLogs(final List<Log> logList) { final boolean scroll = mAutoScroll; mRecyclerAdapter.addAll(logList); if (scroll) mRecyclerView.smoothScrollToPosition(mRecyclerAdapter.getItemCount() - 1); } } 

El RecyclerAdapter:

 public class AdapterLog extends RecyclerView.Adapter<AdapterLog.ViewHolder> { private final List<Log> mLogList; public AdapterLog() { this.mLogList = new ArrayList<Log>(); } @Override public AdapterLog.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.listitem_log, parent, false); return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.mTextView.setText(getItem(position).getMessage()); holder.mTextView.setTextColor(getItem(position).getLevel().getColor()); } @Override public int getItemCount() { return mLogList.size(); } public Log getItem(int position) { return mLogList.get(position); } public void addAll(List<Log> logList) { mLogList.addAll(logList); notifyDataSetChanged(); } public void removeFirstItems(int count) { for (int i=0; i<count; i++) mLogList.remove(0); notifyDataSetChanged(); } public void clear() { mLogList.clear(); notifyDataSetChanged(); } public static class ViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; public ViewHolder(View v) { super(v); mTextView = (TextView) v.findViewById(R.id.listitem_log_textview); } } } 

Le está diciendo a su opinión que cambió su adaptador completo. Para las adiciones, supresiones y reordenamientos considere el uso de los siguientes métodos:

 notifyItemRangeChanged notifyItemRangeInserted notifyItemRangeRemoved notifyItemMoved notifyItemInserted notifyItemChanged notifyItemRemoved 

Por lo tanto, en su caso, está eliminando los elementos de la count superior para:

 notifyItemRangeRemoved(0,count) 

Debe hacer el trabajo.

 public class viewHolderFav extends RecyclerView.ViewHolder { private ImageView image; private TextView name; public viewHolderFav( View itemView ) { super( itemView ); image = ( ImageView ) itemView.findViewById( R.id.txt_image_fav ); name = ( TextView ) itemView.findViewById( R.id.txt_name_fav ); edite.setOnClickListener( new View.OnClickListener( ) { @Override public void onClick( View v ) { remove( posts.get( getLayoutPosition() ) ); } } ); } public void remove(DataBoj item) { int position = posts.indexOf(item); posts.remove(position); notifyItemRemoved(position); } 
  • Cómo agregar una vista dinámica entre los elementos de RecyclerView en android?
  • RecyclerView onBindViewHolder sólo se llama cuando los cambios getItemViewType
  • ¿Hay observadores escritos en RecyclerView.Adapter para saber si el conjunto de datos ha sido cambiado?
  • Haga doble clic en OnClickListener de un adaptador de vista de reciclador
  • Recuperando onBindViewHolder al desplazarse por la vista Recycler
  • Elemento RecyclerView que no muestra ondulaciones / retroalimentación táctil cuando el elemento tiene una casilla de verificación
  • Elemento de Recyclerview efecto de ondulación de clic
  • RealmSearchAdapter no recicla la vista
  • Error al inflar la clase RecyclerView
  • Recyclerview lag en desplazamiento debido a los anuncios de Admob
  • StaggeredGridLayout desordena al desplazarse hacia arriba
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.