2013-07-11 86 views
1

我找過這個問題,但沒有找到符合我的情況。發生薑餅listview項目動畫問題

我的問題onAndroid 2.3.x版本(上4.x版它完美的作品)

我有一個自定義列表視圖的應用程序。我初始化我的ListView如下

ListAdapter mListAdapter = new ListAdapter(getApplicationContext(), this, ...); 
lvSelector = (ListView) findViewById(R.id.listView1); 
lvSelector.setAdapter(mListAdapter); 

我ListAdapter如下:

public class ListAdapter extends BaseAdapter { 
    static class Holder { 
    LinearLayout layoutRoot, layoutColor; 
    TextView hText; 
    Animation anim = AnimationUtils.loadAnimation(mActivity, R.anim.anim_list_item); 

    public Holder() { 
     layoutRoot = new LinearLayout(mContext); 
     layoutColor = new LinearLayout(mContext); 
     hText = new TextView(mContext); 
    } 

    public Holder(Holder holder) { 
     this.layoutRoot = holder.layoutRoot; 
     this.layoutColor = holder.layoutColor; 
     this.hText = holder.hText; 
    } 
} 

    int mSwap1, mSwap2; 

    Animation mAnimation; 

    public ListAdapter(Context _context, Activity _activity, FileHandler _fileHandler, String _strSchemaName, List<String> _list, List<String> _solution) { 
     mContext = _context; 
     mActivity = _activity; 

     mAnimation = AnimationUtils.loadAnimation(mActivity, R.anim.anim_list_item); 
     mAnimation.reset(); 

     mSwap1 = mSwap2 = -1; 

     /* ... */ 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      final int fPosition = position; 

    View row = convertView; 
    Holder lHolder = null; 

    if (row==null) { 
       LayoutInflater inflater = mActivity.getLayoutInflater(); 
       row = inflater.inflate(R.layout.layout_schema_element, parent, false); 

       lHolder = new Holder(); 
       lHolder.layoutRoot = (LinearLayout) row.findViewById(R.id.elementLayoutRoot); 
       lHolder.layoutColor = (LinearLayout) row.findViewById(R.id.elementLayoutColor); 
       lHolder.hText = (TextView) row.findViewById(R.id.textViewWord); 

       row.setTag(lHolder); 
      } 
      else { 
       lHolder = (Holder)row.getTag(); 
      } 

      row.setOnClickListener(null); 

      if (position==0 || position==mDataList.size()-1) { 
       lHolder.layoutColor.setBackgroundResource(R.drawable.bg_elem_fixed); 
       lHolder.layoutColor.setOnClickListener(null); 
      } 
      else { 
       lHolder.layoutColor.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         moveElement(fPosition); 
        } 
       }); 

    } 

    lHolder.hText.setText(mDataList.get(position)); 
    lHolder.layoutRoot.setBackgroundResource(0); 

    mHolder.set(position, lHolder); 

    return row; 
    } 
} 

protected void moveElement(int _element) { 
    if (mDataList.get(_element).equals(mSolution.get(_element))) 
     return; 

    if (mSwap1==-1) 
    { 
     System.out.println("setting swap1=" + _element); 
     mHolder.get(_element).layoutRoot.setBackgroundResource(R.drawable.bg_elem_selected_lite); 
     mSwap1 = _element; 
    } 
    else 
    { 
     if (mSwap2==-1) 
     { 
      System.out.println("setting swap2=" + _element); 

      mHolder.get(_element).layoutRoot.setBackgroundResource(R.drawable.bg_elem_selected_lite); 
      mSwap2 = _element; 
     } 
    } 

      if (mSwap1!=-1) 
    { 
     System.out.println("running animation on mSwap1=" + mSwap1); 
     mHolder.get(mSwap1).layoutRoot.clearAnimation(); 
     mHolder.get(mSwap1).layoutRoot.startAnimation(mAnimation); 
    } 

    /***** THIS IS WHAT DOES NOT WORK *****/ 
      if (mSwap2!=-1) 
    { 
     System.out.println("running animation on mSwap2=" + mSwap2); 
     mHolder.get(mSwap2).layoutRoot.clearAnimation(); 
     mHolder.get(mSwap2).layoutRoot.startAnimation(mAnimation); 
    } 


    if (mSwap1!=-1 && mSwap2!=-1) 
    { 
     mHolder.get(mSwap1).layoutRoot.setBackgroundColor(0); 
     mHolder.get(mSwap2).layoutRoot.setBackgroundColor(0); 

     if (mSwap1==mSwap2) 
     { 
      mSwap1 = mSwap2 = -1; 
      return; 
     } 

     Collections.swap(mDataList, mSwap1, mSwap2); 
     Collections.swap(mHolder, mSwap1, mSwap2); 
     Collections.swap(dataObjs, mSwap1, mSwap2); 

     mSwap1 = mSwap2 = -1; 

     notifyDataSetChanged(); 
    } 
} 

}

一切工作正常,當我執行Collections.swap(列表,mSwap1,mSwap2),元素被正確地交換。

第一個動畫(mSwap1)運行正常;我的問題是,當第二個動畫運行(mSwap2)時,即使mSwap2正確(例如:mSwap1 = 1 - >列表中的第二個元素爲動畫,mSwap2 = 2 - > n-1元素和列表中的n-2元素是動畫的,其中n是可見元素的數量)。

回答

0

我已經解決了我的問題,更換動畫調用

mHolder.get(idx).layoutRoot.clearAnimation(); 
mHolder.get(idx).layoutRoot.startAnimation(mAnimation); 

以下方法

private void animateItem(int _index, Animation _animation) { 
    if (
     _index<mLvSelector.getFirstVisiblePosition() // selected item is above first visible element 
     || _index>mLvSelector.getLastVisiblePosition() // selected item is below last visible element 
    ) 
     // element is invisible -> no animation 
     return; 

    int newIndex = _index; 

    if (
     android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH // before android 4.0 
     && mSwap2>=0 // second selection 
     && mSwap1!=mSwap2 // second selection differs from first selection 
    ) 
     newIndex = mLvSelector.getFirstVisiblePosition() + (mLvSelector.getLastVisiblePosition() - _index); 

    mHolder.get(newIndex).layoutRoot.clearAnimation(); 
    mHolder.get(newIndex).layoutRoot.startAnimation(_animation); 
} 

添加動畫參數的方法可以區分(mSwap1和mSwap2)元素之間的動畫。