你能帮我找到一个没有泄漏的正确方法来为RecylcerView项目的子项目制作动画吗?
我想创建一个两级抽屉菜单,其中菜单项位于由适配器创建的RecyclerView中。某些菜单项包含子项,此项可以在末尾用箭头打开,以将子项添加到父项下面的列表中。 当适配器检测到父项必须打开/关闭并显示/删除子项时,我想动画这些箭头旋转180度。
整件事情正在发挥作用,但我对动画解决方案不满意。 :(
我正在使用数据绑定来用数据填充这些项目,这是多么棘手的部分。
这是我的课程包含的数据:
public class MenuItem extends BaseObservable {
public ObservableField<String> name = new ObservableField<>();
public ObservableBoolean selected = new ObservableBoolean(false);
public ObservableBoolean isSubItem = new ObservableBoolean(false);
public MenuItem parent;
public List<MenuItem> subItems = new ArrayList<>(0);
private DrawerAdapter.OnDrawerItemClickListener listener;
/* It's a potencial leak */
public View arrow;
.....
public void animateArrow(boolean isOpen) {
if(arrow == null)
return;
float degrees = isOpen ? 180f : 0f;
arrow.animate().roatate(degrees).setDuration(300).start();
}
}
这是我的ViewHolder:
public class DrawerItemHolder extends RecyclerView.ViewHolder {
public DrawerItemBinder ui;
public DrawerItemHolder(View itemView) {
super(itemView);
ui = DataBindingUtil.bind(itemView);
}
}
以下是我与ViewHolder绑定的方式:
@Override
public void onBindViewHolder(DrawerItemHolder holder, int position) {
MenuItem item = items.get(position);
if(!item.subItems.isEmpty())
item.arrow = holder.ui.arrow;
holder.ui.setData(item);
}
我仅在箭头视图中附加了具有子项目的项目。
当适配器决定打开一个项目时,它会调用此方法:
private void openCategories(MenuItem item) {
...
/* Animate to close state the already opened category's arrow */
if(openedCategory != null)
openedCategory.animateOpener(false);
openedCategory = item;
/* Animate to opened state the newly opened category */
openedCategory.animateOpener(true);
notifyItemRangeInserted(...);
}
opensCategory也是一个MenuItem,是对父项实际打开的引用。
当想关闭某个项目时,请调用:
private void closeCategories() {
if (openedCategory == null)
return;
...
notifyItemRangeRemoved(...);
/* Animate to closed state the already opened category's arrow */
openedCategory.animateOpener(false);
openedCategory = null;
}
所以我的问题是这个。如何通过在MenuItem类中保留对它们的引用而不泄漏这些箭头视图来为父项目的子视图设置动画?
最诚挚的问候!