2015-06-20 1 views
1

Я пытаюсь создать Recyclerview, который будет прокручиваться вверх, а затем анимировать добавление элемента в recyclerview.Recyclerview - smoothScrollToPosition до вершины списка, а затем анимировать добавление элемента

Это код, который я до сих пор:

 while (!mLayoutManager.isSmoothScrolling()) { 
      mRecyclerView.smoothScrollToPosition(0); 
     } 
     PostList.add(0, post); 
     mAdapter.notifyItemInserted(0); 
     mAdapter.notifyItemRangeChanged(1, PostList.size()); 

Это делает свитки к вершине, но добавление элемента не анимированный (хотя он добавляется в список).

Я думаю, что это связано с тем, что анимация добавления происходит одновременно с анимацией smoothScrollToPosition, и поэтому, когда она достигла вершины, анимация добавления уже завершена, поэтому мы ее не видим.

Я могу использовать Handler.postDelayed, чтобы дать анимацию прокрутки некоторое время, чтобы закончить, но это не предпочтительнее, так как я не знаю, как закончится анимация smoothScrollToPosition.

ответ

4

Я думаю, вы надеетесь, что когда все закончится, прокрутка будет завершена. Это не так, как это работает, прокрутка происходит в анимационном кадре, и если вы должны положить цикл while, ожидающий его завершения, ваше приложение замерзнет, ​​потому что вы будете блокировать основной поток.

Вместо этого, вы можете сделать что-то вроде этого:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
    public void onScrollStateChanged(RecyclerView rv, int state) { 
     if (state == RecyclerView.SCROLL_STATE_IDLE) { 
      PostList.add(0, post); 
      mAdapter.notifyItemInserted(0); 
      rv.removeOnScrollListener(this); 
     } 
    } 
}); 
recyclerView.smoothScrollToPosition(0); 

не проверял код, но основная идея заключается в том, чтобы добавить прокрутки слушателя, чтобы получить уведомление, когда гладкие остановки прокрутки, а затем добавить элемент.

+0

Привет, спасибо за ваш ответ - я, похоже, не могу найти addOnScrollListener или removeOnScrollListener в классе recyclerview, даже если он указан как метод в документах https://developer.android.com/reference/ Android/поддержка/v7/виджет/RecyclerView.html # removeOnScrollListener (android.support.v7.widget.RecyclerView.OnScrollListener). Я в тупике, я использую com.android.support:recyclerview-v7:22.0.+ – Simon

+1

Используйте 22.2. Раньше был setOnScrollListener. – yigit

+1

Спасибо - код работает, если я добавлю еще одну строку в метод: mRecyclerView.smoothScrollToPosition (0); – Simon