2017-05-22 64 views
2

我有一個RecyclerView它被RealmRecyclerViewAdapter填充,但不知何故數據改變時沒有動畫播放。 適配器類使用多個ViewHolders用於不同的佈局,但不應該影響動畫的權利?Android Realm RecyclerView動畫無效?

public class DiaryPageEntryAdapter extends RealmRecyclerViewAdapter<Entry, RecyclerView.ViewHolder> { 

     static class MealEntryViewHolder extends RecyclerView.ViewHolder { 
       @BindView(R.id.item_diary_entry_drink_title) TextView tvMealEntryTitle; 
       @BindView(R.id.item_diary_entry_meal_time) TextView tvMealEntryTime; 
       BindView(R.id.item_diary_entry_meal_bullet_list) RecyclerView rvBulletList; 

     MealEntryBulletAdapter bulletAdapter; 

     public MealEntryViewHolder(View itemView) { 
      super(itemView); 
      ButterKnife.bind(this, itemView); 
      this.bulletAdapter = new MealEntryBulletAdapter(); 
      rvBulletList.setLayoutManager(new LinearLayoutManager(itemView.getContext())); 
      rvBulletList.setAdapter(this.bulletAdapter); 
     } 

     void bindData(MealEntry mealEntry) { 
      tvMealEntryTitle.setText(mealEntry.getTitle()); 
      tvMealEntryTime.setText(DateTimeUtils.timeValueToText(itemView.getContext(), mealEntry.getTime())); 
      this.bulletAdapter.updateData(mealEntry.getConsumedMeals() ,mealEntry.getConsumedDrinks()); 
     } 
    } 

// Other ViewHolders 

    public DiaryPageEntryAdapter(@Nullable OrderedRealmCollection<Entry> data, boolean autoUpdate) { 
     super(data, autoUpdate, true); 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     switch (viewType) { 
      case MEAL_ENTRY: 
       // Inflate meal entry layout and then create a new meal view holder with it 
       View rowMeal = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_diary_entry_meal, parent, false); 
       return new MealEntryViewHolder(rowMeal); 
      // Other case options. 
     } 

@Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     Entry entry = getItem(position); 

     if(Entry.isMealEntry(entry)) { 
      MealEntryViewHolder mealHolder = (MealEntryViewHolder) holder; 
      mealHolder.bindData(Entry.getMealEntryFromEntry(entry)); 
     } 
    // Other if branches. 
    } 

@Override 
    public int getItemViewType(int position) { 
     Entry entry = getItem(position); 

     if(Entry.isMealEntry(entry)) return MEAL_ENTRY; 
     // Other if branches. 
    } 

用於設置RecyclerView和適配器代碼看起來如下:

 RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.frag_diary_page_rv_entries); 
     recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 

     entryAdapter = new DiaryPageEntryAdapter(null, true); 
     recyclerView.setAdapter(entryAdapter); 

所述數據結合到適配器的代碼如下所述:

RealmResults<Entry> sortedEntries = diaryEntry.getEntries() 
       .where() 
       .findAllSortedAsync("time"); 

entryAdapter.updateData(sortedEntries); 

的自動更新工作正常,但不知何故數據改變時沒有動畫。一個新的條目只是出現,但沒有動畫。此外,一旦RecyclerView首次被填充,我想要一個簡短的動畫 - 一個類似於[http://anthony-skr.com/article/recyclerview-items-animation-with-rebound-effect][1]的入口動畫。

注:在我app's的build.gradle文件

dependencies { 
// Other dependencies 
compile 'io.realm:android-adapters:2.1.0' 
} 

在項目的build.gradle文件:

dependencies { 
     classpath 'com.android.tools.build:gradle:2.3.2' 
     classpath "io.realm:realm-gradle-plugin:3.1.4" 
} 
+0

我沒有看到任何動畫代碼.... –

回答

0

從您的代碼示例,它是不容易看看你從哪裏撥打entryAdapter.updateDate(),但在每次更新時不斷調用此方法將禁用所有動畫,因爲它只調用notifyDataSetChanged()

更標準的模式是這樣的:

RealmResults<Entry> sortedEntries = diaryEntry.getEntries() 
       .where() 
       .findAllSortedAsync("time"); 
entryAdapter = new DiaryPageEntryAdapter(sortedEntries, true); 
recyclerView.setAdapter(entryAdapter); 

動畫應該工作,如果你做了以上。