Android 将动画listitem返回到正常状态

Android 将动画listitem返回到正常状态,android,android-listview,android-animation,Android,Android Listview,Android Animation,我有一个带有动画listitems的listview,当listview中的一个项目被选中时,它会淡出并变得不可见,但我遇到的问题是,当另一个项目被选中时,它不会返回到正常状态 我已经设置了android:fillEnabled=“true”和android:fillAfter=“true”,使列表项保持动画状态 像这样: ListItem已选中 ListItem已设置动画并淡出 是完全动态和不可见的 已选择另一个列表项 设置动画并淡出 两个列表项都已淡出,但我只希望一次设置一个动画/不可见

我有一个带有动画listitems的listview,当listview中的一个项目被选中时,它会淡出并变得不可见,但我遇到的问题是,当另一个项目被选中时,它不会返回到正常状态

我已经设置了
android:fillEnabled=“true”
android:fillAfter=“true”
,使列表项保持动画状态

像这样:

  • ListItem已选中
  • ListItem已设置动画并淡出
  • 是完全动态和不可见的
  • 已选择另一个列表项
  • 设置动画并淡出
  • 两个列表项都已淡出,但我只希望一次设置一个动画/不可见
  • 以下是animation.xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/bounce_interpolator"
    android:fillEnabled="true"
    android:fillAfter="true"
    >
    
    <scale
    android:duration="600"
    android:fromXScale="0.75"
    android:fromYScale="0.75"
    android:pivotX="25%"
    android:pivotY="25%"
    android:toXScale="1.00"
    android:toYScale="1.00" />
    
    <alpha
    android:duration="250"
    android:fromAlpha="1.0"
    android:toAlpha="0.0" />
    
    </set>
    
    
    
    以及listview:

    @Override
            public void onComplete(List<Profile> friends) {
    
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mSpinner.setVisibility(View.GONE);
                        mSpinner.clearAnimation();
                    }
                    });
    
                // populate list
                List<String> values = new ArrayList<String>();
                for (Profile profile : friends) {
                    //profile.getInstalled();
                    values.add(profile.getName());
                }
    
                listView = (ListView) findViewById(R.id.list);
                listView.setOnItemClickListener(new OnItemClickListener() {
    
                    @Override
                    public void onItemClick(AdapterView<?> av, final View view, final int i, long i2) {
    
                      Animation anim = AnimationUtils.loadAnimation(SendActivity.this, R.anim.jump);
                      view.startAnimation(anim);
    
                }
                });  
    
                ArrayAdapter<String> friendsListAdapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.list_items2, values);
                friendsListAdapter.sort(new Comparator<String>() {
                    @Override
                    public int compare(String lhs, String rhs) {
                        return lhs.compareTo(rhs);    
                    }
                });
                mFriendsList.setAdapter(friendsListAdapter);
            }
        };
    
    @覆盖
    未完成的公共作废(列出好友){
    runOnUiThread(新的Runnable(){
    @凌驾
    公开募捐{
    mSpinner.setVisibility(View.GONE);
    mSpinner.clearAnimation();
    }
    });
    //填充列表
    列表值=新的ArrayList();
    用于(个人资料:朋友){
    //profile.getInstalled();
    add(profile.getName());
    }
    listView=(listView)findViewById(R.id.list);
    setOnItemClickListener(新的OnItemClickListener(){
    @凌驾
    公共虚线单击(AdapterView av、最终视图、最终int i、长i2){
    动画动画=AnimationUtils.loadAnimation(SendActivity.this,R.anim.jump);
    视图。startAnimation(动画);
    }
    });  
    ArrayAdapter friendsListAdapter=新的ArrayAdapter(getApplicationContext(),R.layout.list_items2,values);
    排序(新的比较器(){
    @凌驾
    公共整数比较(字符串lhs、字符串rhs){
    返回左侧比较(右侧);
    }
    });
    设置适配器(friendsListAdapter);
    }
    };
    

    关于如何做到这一点,有什么提示吗?

    您需要在适配器的
    getView
    方法中设计一些逻辑,以便所选行的backing对象具有布尔属性,比如isClicked。在
    getView
    方法中,检查对象是否为true,如果为true,则返回null,否则返回视图

    您可以设计类似的备用逻辑。

    还有其他(更优雅的)方法。但这是我首先想到的+我已经在评论中提出了这个解决方案

    private View animatedView = null;
    
    //....code .. code .. code...
    
    listView.setOnItemClickListener(new OnItemClickListener() {    
        @Override
        public void onItemClick(AdapterView<?> av, final View view, final int i, long i2) { 
            if (animatedView != null){
               Animation anim = AnimationUtils.loadAnimation(SendActivity.this, R.anim.unjump);
               animatedView.startAnimation(anim);
            }
    
            Animation anim = AnimationUtils.loadAnimation(SendActivity.this, R.anim.jump);
            view.startAnimation(anim);
            animatedView = view;
        } 
    });  
    
    
    
    //another animation (called it unjump) to clear the alpha level 
    //reusing your stuff
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
      android:interpolator="@android:anim/bounce_interpolator"
      android:fillEnabled="true"
      android:fillAfter="true"
    >
    
    <scale
      android:duration="600"
      android:fromXScale="0.75"
      android:fromYScale="0.75"
      android:pivotX="25%"
      android:pivotY="25%"
      android:toXScale="1.00"
      android:toYScale="1.00" />
    
    <alpha
      android:duration="250"
      android:fromAlpha="0.0"   //exchanged from/to -alpha levels (so this would come from transparent to non-transparent)
      android:toAlpha="1.0" />
    </set>
    
    private View animatedView=null;
    //……代码。。代码。。代码。。。
    setOnItemClickListener(新的OnItemClickListener(){
    @凌驾
    公共视图(AdapterView av、最终视图、最终int i、长i2){
    如果(animatedView!=null){
    Animation anim=AnimationUtils.loadAnimation(SendActivity.this,R.anim.unjump);
    动画视图。startAnimation(动画);
    }
    动画动画=AnimationUtils.loadAnimation(SendActivity.this,R.anim.jump);
    视图。startAnimation(动画);
    动画视图=视图;
    } 
    });  
    //另一个用于清除alpha级别的动画(称为unjump)
    //重复使用你的东西
    
    将先前选择的元素存储到位置,下次按下其他元素时,将先前的元素返回到正常状态。谢谢,您能否给出一个代码示例,说明如何添加此元素?