1

所以,標題幾乎說明了一切。我有一個listview,裏面填充了一個顯示數據庫數據的自定義遊標適配器。我有一個將項目添加到列表的工作正常,但無法獲得從列表中刪除項目的動畫工作的動畫。我擔心該項目正在從數據庫中刪除,並且在動畫有機會執行之前正在刷新列表。我很感激任何幫助解決這個問題。LayoutTransition DISAPPEARING動畫不適用於光標適配器

動畫代碼

LayoutTransition transition = new LayoutTransition(); 
    Animator appearAnim = ObjectAnimator.ofFloat(null, "rotationX", 90f, 0f) 
      .setDuration(android.R.integer.config_shortAnimTime); 
    Animator disappearAnim = ObjectAnimator.ofFloat(null, "alpha", 1f, 0f) 
      .setDuration(android.R.integer.config_longAnimTime); 
    transition.setAnimator(LayoutTransition.APPEARING, appearAnim); 
    transition.setAnimator(LayoutTransition.DISAPPEARING, disappearAnim); 
    mNotesListView.setLayoutTransition(transition); 

的delete注意方法

@Override 
    public void deleteNote(final String noteId) { 
     new Thread() { 
      @Override 
      public void run() { 
       super.run(); 
       mNotesTable.deleteNote(mDb, noteId); 
       int notebookNumber = mNoteBookFragment.getNotebookNumber(); 
       final Cursor cursor = mNotesTable.notesQuery(mDb, notebookNumber); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         mNoteBookFragment.refreshNoteList(cursor); 
         Toast.makeText(BlocNotes.this, 
           getString(R.string.delete_note_toast), Toast.LENGTH_LONG).show(); 
        } 
       }); 
      } 
    }.start(); 
} 

,並刷新列表

public void refreshNoteList(Cursor cursor) { 
     mNoteAdapter.changeCursor(cursor); 
     mNoteAdapter.notifyDataSetChanged(); 

     setNewNoteText(""); //clear the text 

    } 

編輯刷新方法

public void refreshNoteList(Cursor cursor) { 
     mTransition.removeChild(mNoteAdapter.getParent(), mNoteAdapter.getView()); 
     mNoteAdapter.changeCursor(cursor); 
     mNoteAdapter.notifyDataSetChanged(); 

     setNewNoteText(""); //clear the text 

    } 

回答

1

我遇到了同樣的問題。在刷新ListView之前,您應在Transition上撥打removeChild(parentView, childView)。這可能不是最好的方式,但它有效。

我會使用一個Loader這裏順便說一下:http://developer.android.com/guide/components/loaders.html

UPD:您所需要的動畫完成後運行你的代碼的其餘部分(否則會被打斷)。像這樣的:

public void refreshNoteList(Cursor cursor) { 
    transition.removeChild(ListView mNotesListView, View mNotesListView.getChildAt(int position); 
    new Handler().postDelayed(new Runnable(){ 
     public void run() { 
      mNoteAdapter.changeCursor(cursor); 
      mNoteAdapter.notifyDataSetChanged(); 

      setNewNoteText(""); //clear the text 
     } 
    }, disappearAnim.getDuration()); 
} 
+0

嘿,對不起,剛剛回到這個工作後,另一個項目。看來加載器可能是最好的方式去這麼謝謝你。我將在未來的項目中研究這一點。但是,removeChild方法沒有骰子。我在上面添加了我更新的刷新方法,但我只是簡單地將轉換添加爲成員變量,併爲適配器中的視圖和父級添加了getter。我不確定這是否正確,請讓我知道 – 2014-12-23 17:29:25

+0

好吧,所以實現此可運行性本質上不會導致應用程序無法正常工作。它似乎甚至沒有運行,因爲當我添加或刪除它的東西時,列表未更新 – 2014-12-29 22:52:40

+1

嗨!對不起長時間的沉默。我對這段代碼有點困惑: 'mTransition.removeChild(mNoteAdapter.getParent(),mNoteAdapter.getView());' 您需要獲取對ListView實例的引用並獲取它的子視圖(您想要刪除的視圖)。你也可以嘗試設置孩子對'View.GONE'的可見性,它也會觸發動畫。 – Nikolai 2015-02-08 00:55:52