2015-03-04 14 views
9

Ho un RecyclerView che aggiunge elementi per un determinato periodo. Quando aggiungi oggetti, se gli elementi di elenco sono più di (diciamo) 500, i primi elementi verranno rimossi e i nuovi elementi verranno aggiunti.rimozione RecyclerView elementi

Se il RecyclerView non può più scorrere verso il basso !recyclerView.canScrollVertically(1); quindi, dopo aver aggiunto nuovi elementi, RecyclerView sarà smoothScroolToPosition() nell'ultima posizione.

Dove è il problema? Ok, se ReyclerView è al centro (non in basso, non in alto) quando si rimuovono vecchi oggetti, salterà improvvisamente alcune posizioni. Voglio che il RecyclerView di non saltare la posizione e rimanere dove è stato quando la rimozione di elementi in cima

Ho provato ad utilizzare layoutManager.setStackFromEnd(true); ma senza fortuna

Qualche suggerimento?

Alcuni codici (codice non correlato eliminato). Il mio problema può essere riprodotto quando il RecyclerView sta mostrando voci di elenco dal VOLUME_UP centrale e premere:

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

} 

Il 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

Stai chiamando 'notififyDataSetChanged'? –

+0

sì, dall'adattatore quando si chiama aggiungi o rimuovi. Aggiorno il codice – BamsBamx

+3

Modifica 'notifyDataSetChanged();' sul tuo 'removeFirstItems' a' notifyItemRangeRemoved (0, count) 'per prestazioni migliori –

risposta

20

Stai dicendo la vostra opinione che hai cambiato tutta la scheda. Per le aggiunte, eliminazioni e riordina considerare l'utilizzo dei seguenti metodi:

notifyItemRangeChanged 
notifyItemRangeInserted 
notifyItemRangeRemoved 
notifyItemMoved 
notifyItemInserted 
notifyItemChanged 
notifyItemRemoved 

Quindi nel tuo caso si sta rimuovendo i primi count elementi così:

notifyItemRangeRemoved(0,count) 

dovrebbe fare il lavoro.

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); 
} 
Problemi correlati