Android Realm RecyclerView动画不起作用?

时间:2017-05-22 06:09:02

标签: java android realm

我有一个RecyclerViewRealmRecyclerViewAdapter填充,但不知何故,当数据发生变化时,没有动画播放。 适配器类使用多个ViewHolders用于不同的布局,但这不应影响动画吗?

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]的入口动画。

注意:在我的应用的build.gradle文件中

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

在Project build.gradle文件中:

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

1 个答案:

答案 0 :(得分:0)

从您的代码示例中,很难看到您从哪里调用public void setConsult(String mConsult) throws SQLException, IllegalStateException { if (!mConnected) { throw new IllegalStateException("Theres no DB connection"); } mAllResults = mStatement.executeQuery(mConsult); mMetaData = mAllResults.getMetaData(); mAllResults.last(); mNumberOfRows = mAllResults.getRow(); fireTableStructureChanged(); } ,但在每次更新时连续调用此方法都会禁用所有动画,因为它只调用entryAdapter.updateDate()

更标准的模式如下所示:

notifyDataSetChanged()
如果您执行上述操作,

动画应该