2015-03-04 20 views
9

Mam RecyclerView, który dodaje elementy każdego określonego okresu. Podczas dodawania obiektów, jeśli elementy listy są większe niż (powiedzmy) 500, to pierwsze elementy zostaną usunięte, a nowe elementy zostaną dodane.usuwanie RecyclerView przedmiotów

Jeśli RecyclerView nie może już przewinąć w dół !recyclerView.canScrollVertically(1);, to po dodaniu nowych pozycji RecyclerView osiągnie smoothScroolToPosition() do ostatniej pozycji.

Gdzie jest problem? OK, jeśli ReyclerView znajduje się pośrodku (nie na dole, nie na górze) podczas usuwania starych przedmiotów, nagle podskoczy kilka pozycji w górę. Chcę RecyclerView nie skakać pozycję i pozostać tam, gdzie to było, gdy usuwanie elementów w górnym

Próbowałem za pomocą layoutManager.setStackFromEnd(true); ale bez powodzenia

Wszelkie sugestie?

Kod (niepowiązany kod jest usuwany). Mój problem może być powielana gdy RecyclerView wyświetla listę elementów ze środkowej i prasy 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); 
    } 

} 

The 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

Czy nazywasz 'notififyDataSetChanged'? –

+0

tak, z adaptera podczas połączenia dodaj lub usuń. Aktualizuję kod – BamsBamx

+3

Zmień 'notifyDataSetChanged();' na twoim 'removeFirstItems' na' notifyItemRangeRemoved (0, count) 'dla lepszej wydajności –

Odpowiedz

20

mówisz swój pogląd, że zmieniłeś całe adaptera. Dla uzupełnienia, skreślenia i zmienia kolejność rozważyć stosując następujące metody:

notifyItemRangeChanged 
notifyItemRangeInserted 
notifyItemRangeRemoved 
notifyItemMoved 
notifyItemInserted 
notifyItemChanged 
notifyItemRemoved 

Więc w twoim przypadku masz usunięcie najlepszymi count przedmiotów tak:

notifyItemRangeRemoved(0,count) 

powinien wykonać pracę.

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