我有一个带5-10个项目的导航抽屉。我已经为这些项目添加了动画,以便它们从左向右滑动。问题是这种情况只在我第一次打开抽屉时发生,在其余时间没有动画。作为补救措施,我在onDrawerOpened(View drawerView)方法内的适配器上添加notifyDataSetChanged。现在这些项目每次都有动画,但它的效果就像是
所以我想要的是=>每次打开抽屉时,导航抽屉项目都必须从左到右进行动画制作,使用滑动以及单击导航切换。
我的一些代码片段让我知道我做了什么 内部适配器膨胀视图:
@Override
public View getView(int position, LayoutInflater inflator, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = inflator.inflate(R.layout.base_drawer_nav_item, parent, false);
ImageView nav_item_icon = (ImageView) convertView.findViewById(R.id.nav_item_icon);
TextView nav_item_title = (TextView) convertView.findViewById(R.id.nav_item_title);
nav_item_icon.setImageResource(this.icon);
nav_item_title.setText(this.title);
}
if(convertView != null)
setAnimation(convertView, position);
return convertView;
}
private void setAnimation(View viewToAnimate, int position) {
if(mContext != null) {
Animation animation = AnimationUtils.loadAnimation(mContext, android.R.anim.slide_in_left);
animation.setDuration(position * 50 + 200);
viewToAnimate.startAnimation(animation);
}
}
导航抽屉在onCreate()方法中的内部活动(请注意,我只添加了notifyDataSetChanged作为一种肯定不能按预期工作的补救措施)
//some code above and below this
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) {
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
invalidateOptionsMenu();
adapter.notifyDataSetChanged();
}
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
invalidateOptionsMenu();
}
};
我的另一个想法是,我应该将所有视图保留在ArrayList中,然后每次打开navigationDrawer时使用动画(使用for循环+ animation.start())虽然我没有实现它。
答案 0 :(得分:1)
你的方法setAnimation()不是设置动画,而是调用它并执行一次。因此,每次要为行设置动画时(例如,滑动或单击),您都必须调用setAnimation()
编辑:notifyDataSetChanged有效,因为它在适配器中调用getView()方法,最后调用你的setAnimation()
EDIT2:也许是这样的:从适配器移动你的setAnimation()。现在,解决方案很少,但只需将其放在MainActivity中,然后制作此方法:
public void setAnimation(int position){
Animation animation = AnimationUtils.loadAnimation(mContext, android.R.anim.slide_in_left);
animation.setDuration(position * 50 + 200);
drawerListView.getChildAt(position).startAnimation(animation);
}
这将为一行设置动画,您可以轻松地从主活动中调用它。
如果您希望所有动画行都可以在for循环中执行并调用每个位置,但更好的方法是使用AnimationSet。