2015-11-13 45 views
2

所以想象一下,首先我們在我們的RecyclerView中加載10個項目。添加或刪除一個元素給我們一個很好的動畫(適配器有穩定的ID)。清除整個適配器並添加新元素時的RecyclerView動畫

問題是,我有一個搜索欄,我可以找一些東西,然後結果應該替換RecyclerView的當前項目。如果某個項目已經在那裏,那麼就有一個很好的「移動」動畫。但是,如果所有項目都是新的,那麼就會有一個相當難看的淡入淡出過渡,它太快而且看起來像一個小故障。是否有可能重寫該動畫?我想要淡入淡出,但速度較慢。

順便說一句,當查詢與返回結果,我這樣做的適配器:

mItems.clear(); 
mItems.addAll(resultItems); 
notifyDataSetChanged(); 

而且,這是值得的說,如果我沒有結果的搜索,然後我看到了RecyclerView空,然後如果我再次得到一些結果,從空狀態到一些結果的轉換看起來不錯。

回答

1

您可以批量刪除並插入RecyclerView中的項目。

adapter.notifyItemRangeRemoved(0, mItems.size()); 
mItems.clear(); 
mItems.addAll(resultItems); 
adapter.notifyItemRangeInserted(0, mItems.size()); 

編輯:在看你的問題後,你可能不想做我上面建議的。相反,你不應該清除你的列表,而是刪除一些項目,然後通知適配器的變化與notifyItemRemove(index)

0

如果你做範圍方法像RangeRemoved/RangeAdded,你鬆了在動畫方面。所以,在一個循環中逐個執行,以保持一個接一個的動畫效果,包括循環中的延遲。以下是我已經實現:

MainActivity.java

clearItemsView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final List<LineItem> lineItemsCopy = new ArrayList<>(lineItems); 
      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        for (int i=0; i<lineItemsCopy.size(); i++) { 
         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           salesOrderItemListAdapter.removeItem(0); 
          } 
         }); 
         try { 
          Thread.sleep(500); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      }).start(); 
      Snackbar snackbar = Snackbar.make(coordinatorLayout, getString(R.string.items_cleared_message), Snackbar.LENGTH_LONG) 
        .setAction(getString(R.string.label_undo), new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          new Thread(new Runnable() { 
           @Override 
           public void run() { 
            for (int i=0; i<lineItemsCopy.size(); i++) { 
             final int finalI = i; 
             runOnUiThread(new Runnable() { 
              @Override 
              public void run() { 
               salesOrderItemListAdapter.restoreItem(lineItemsCopy.get(finalI), 0); 
              } 
             }); 
             try { 
              Thread.sleep(500); 
             } catch (InterruptedException e) { 
              e.printStackTrace(); 
             } 
            } 
           } 
          }).start(); 
         } 
        }).setActionTextColor(Color.YELLOW); 
      snackbar.show(); 
     } 
    }); 

RecyclerViewAdapter.java

//Only remove & restore functions are shown  
    public void removeItem(int position) { 
     lineItems.remove(position); 
     notifyItemRemoved(position); 
    } 

    public void restoreItem(LineItem item, int position) { 
     lineItems.add(position, item); 
     notifyItemInserted(position); 
    } 
相關問題