2015-03-04 7 views
9

Ich habe eine RecyclerView, die Elemente in jeder bestimmten Zeit hinzufügen. Wenn Listenobjekte beim Hinzufügen von Objekten mehr als (sagen wir) 500 sind, werden die ersten Elemente entfernt und die neuen Elemente hinzugefügt.Entfernen RecyclerView Artikel

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

Wo ist das Problem? Okay, wenn ReyclerView in der Mitte (nicht unten, nicht oben) ist, wenn alte Gegenstände entfernt werden, springt es plötzlich einige Positionen nach oben. Ich mag die RecyclerView nicht Position springen und bleiben, wo es war, als Einzelteile an der Spitze

Entfernen ich versuchte layoutManager.setStackFromEnd(true); verwenden, aber kein Glück

Irgendwelche Vorschläge?

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

} 

Die 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); 
     } 
    } 
} 
+0

Rufen Sie 'notififyDataSetChanged' an? –

+0

ja, vom Adapter beim Aufruf hinzufügen oder entfernen. Ich aktualisiere den Code – BamsBamx

+3

Ändern Sie 'notifyDataSetChanged();' auf Ihrem 'removeFirstItems' zu' notifyItemRangeRemoved (0, count) 'für eine bessere Leistung –

Antwort

20

Sie Ihre Ansicht zu sagen, dass Sie Ihren gesamten Adapter geändert. Für Ergänzungen, Löschungen und Nachbestellungen betrachten mit den folgenden Methoden:

notifyItemRangeChanged 
notifyItemRangeInserted 
notifyItemRangeRemoved 
notifyItemMoved 
notifyItemInserted 
notifyItemChanged 
notifyItemRemoved 

Also in Ihrem Fall sind Entfernen Sie die Top-count Artikel so:

notifyItemRangeRemoved(0,count) 

die Arbeit machen sollte.

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