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.
- RecyclerView se desplaza hacia arriba en notifyDataSetChanged en la pantalla de chat
- Obtener el elemento seleccionado y su posición en RecyclerView
- Cómo cambiar el tipo de vista de un elemento RecyclerView onClick
- ¿Por qué usar estática con RecyclerView.ViewHolder
- Recyclerview Adaptador y Glide - misma imagen cada 4-5 filas
¿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); } } }
- ¿Recyclerview hace que el último elemento agregado sea el elemento seleccionado?
- NullPointerException en la animación de dissapearence de RecyclerView desde soporte v.23.2.0
- ItemDecoration sobreescribir getItemOffsets () y animación
- ¿Cómo ajustar correctamente el valor de elevación a recyclerview?
- Bloc de vista de reciclador y problema de repetición
- Acerca de ProperScrolling en Horizontal Recycler View
- Cómo eliminar el elemento de RecyclerView con demora
- Cómo implementar correctamente un adaptador para un ListView
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); }
- Uso de un tema para la pantalla de preferencias
- Depuración de una aplicación WebView (Ionic) en Android mediante logcat