Entfernen von RecyclerView Items

Ich habe eine RecyclerView, die Elemente jeden bestimmten Zeitraum hinzufügen. Beim Hinzufügen von Objekten, wenn Listenelemente mehr als (sagen wir) 500, dann werden die ersten Elemente entfernt und die neuen Elemente werden hinzugefügt.

Wenn der RecyclerView nicht mehr nach unten scrollen kann !recyclerView.canScrollVertically(1); Dann, nach dem Hinzufügen neuer Elemente die RecyclerView wird smoothScroolToPosition() auf die letzte Position.

  • Speichern von Doppelwerten in SQLite: Wie kann man Präzision sicherstellen?
  • Recycler-Ansicht nicht anzeigen
  • Verwenden Sie den System-PIN-Dialog in der Android-Anwendung
  • Berechnen Sie den Winkel des berührten Punktes und drehen Sie ihn in Android
  • Ändern Sie benutzerdefinierte Ansicht Breite und Höhe in Android
  • Erstellen von hashmap / map aus XML-Ressourcen
  • Wo ist das Problem? Okay, wenn ReyclerView in der Mitte ist (nicht unten, nicht oben) beim Entfernen von alten Gegenständen, wird es plötzlich einige Positionen hochziehen. Ich möchte, dass die RecyclerView nicht Position springen und dort bleiben, wo es war, wenn man Gegenstände an der Spitze entfernt

    Ich habe versucht mit layoutManager.setStackFromEnd(true); Aber kein Glück

    Irgendwelche Vorschläge?

    Einige Code (nicht verwandter Code wird gelöscht). Mein Problem kann reproduziert werden, wenn die RecyclerView Listenelemente aus der Mitte zeigt und drücken Sie 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); } } 

    Der 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); } } } 

  • Beste Weg, um Google APIs mit OAuth 2.0 auf Android zu verwenden
  • Android Support Package / Kompatibilitätsbibliothek - verwenden Sie v4 oder v13?
  • Wie bekomme ich den Android Tablet Emulator auf der rechten Seite nach oben?
  • Android: Wie deaktiviere ich das Debugging, um den apk hochzuladen
  • Warum Genymotion Emulator ist viel schneller als Android Emulator?
  • So geben Sie die Sortierreihenfolge für die Abfrage an einen Inhaltsanbieter an
  • 2 Solutions collect form web for “Entfernen von RecyclerView Items”

    Du sagst deiner Ansicht, dass du deinen ganzen Adapter gewechselt hast. Für Ergänzungen, Deletionen und Reorder verwenden die folgenden Methoden:

     notifyItemRangeChanged notifyItemRangeInserted notifyItemRangeRemoved notifyItemMoved notifyItemInserted notifyItemChanged notifyItemRemoved 

    Also in deinem Fall beseitest du die Top- count Items so:

     notifyItemRangeRemoved(0,count) 

    Sollte die Arbeit machen.

     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); } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.