我有一个RecyclerView
由RealmRecyclerViewAdapter
填充,但不知何故,当数据发生变化时,没有动画播放。
适配器类使用多个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"
}
答案 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()
如果您执行上述操作,动画应该。