导航抽屉项目仅动画一次

时间:2016-02-16 13:56:45

标签: android animation navigation-drawer notifydatasetchanged

我有一个带5-10个项目的导航抽屉。我已经为这些项目添加了动画,以便它们从左向右滑动。问题是这种情况只在我第一次打开抽屉时发生,在其余时间没有动画。作为补救措施,我在onDrawerOpened(View drawerView)方法内的适配器上添加notifyDataSetChanged。现在这些项目每次都有动画,但它的效果就像是

  1. 所有项目都不输入动画。
  2. 然后所有项目都在我面前重新创建。
  3. 然后他们动画。 希望大家都有个主意。
  4. 所以我想要的是=>每次打开抽屉时,导航抽屉项目都必须从左到右进行动画制作,使用滑动以及单击导航切换。

    我的一些代码片段让我知道我做了什么 内部适配器膨胀视图:

     @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())虽然我没有实现它。

1 个答案:

答案 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