2013-01-13 4 views
1

메시지 삭제시 Gmail 앱 (ICS)에서 제공하는 기능을 달성하려고합니다. 나는 삭제 된 셀 아래의 모든 행을 위로 이동하고 삭제 된 셀을 덮어 버리지 않습니다.Gmail과 같은 목록보기 항목 삭제

<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="false" > 

     <translate android:fromYDelta="0%" android:toYDelta="-100%" 
      android:duration="@android:integer/config_mediumAnimTime"/> 
     <alpha android:fromAlpha="0.0" android:toAlpha="1.0" 
      android:duration="@android:integer/config_mediumAnimTime" /> 

</set> 

지금까지 해낸 모든이있다 : 여기

애니메이션을하고있다

public static List<View> getCellsBelow(ListView listView, int position) { 
    List<View> cells = new ArrayList<View>();  

    for (int i = position + 1; i <= listView.getLastVisiblePosition(); i++) { 
     cells.add(listView.getChildAt(i)); 
    } 

    return cells; 
} 

나는 눈에 보이는 세포가 선택한 셀 노호 다음 foreach는 그들을 애니메이션을 수집합니다. 나는 이것이 성과 재난이라고 두려워한다. 또한 콘텐츠를 다시로드해야한다는 것을 어댑터에 알리는 데 어려움이 있습니다. 일반적으로 나는 onAnimationEndnotifyDataSetChanged이라고 부르지 만 이제는 몇 가지 애니메이션이 차례로 재생됩니다.

친구에게 제안 하시겠습니까? 어쩌면 몇 가지 관점을 자극적으로 움직일 수있는 무언가가 있을까요?

+0

가장 간단한 방법은 삭제 된 행의 높이를 줄이는 것입니다. – yDelouis

+2

그것에 대해 생각하지 않기 때문에 공에서 자신을 쏠거야 ... –

답변

6

업데이트 : : 나는 쳇 하세에 의해 this solution을 확인하는 것이 좋습니다 사람 Android 팀에서 작동합니다. 특히 Android 2.3 이하를 개발하지 않는 경우.


정확히 원하는 내용이어야합니다.

list.setOnItemLongClickListener(new OnItemLongClickListener() { 

    @Override 
    public boolean onItemLongClick(AdapterView<?> parent, 
      final View view, final int position, long id) { 
     removeRow(view, position); 
     return true; 
    } 
}); 

private void removeRow(final View row, final int position) { 
    final int initialHeight = row.getHeight(); 
    Animation animation = new Animation() { 
     @Override 
     protected void applyTransformation(float interpolatedTime, 
       Transformation t) { 
      super.applyTransformation(interpolatedTime, t); 
      int newHeight = (int) (initialHeight * (1 - interpolatedTime)); 
      if (newHeight > 0) { 
       row.getLayoutParams().height = newHeight; 
       row.requestLayout(); 
      } 
     } 
    }; 
    animation.setAnimationListener(new AnimationListener() { 
     @Override 
     public void onAnimationStart(Animation animation) { 
     } 
     @Override 
     public void onAnimationRepeat(Animation animation) { 
     } 
     @Override 
     public void onAnimationEnd(Animation animation) { 
      row.getLayoutParams().height = initialHeight; 
      row.requestLayout(); 
      items.remove(position); 
      ((BaseAdapter) list.getAdapter()).notifyDataSetChanged(); 
     } 
    }); 
    animation.setDuration(300); 
    row.startAnimation(animation); 
} 
+0

좋은 하나 .. 도와 줬어 .. 감사합니다 – Hima

+0

@matthias .. 나를 위해 일했습니다 .. 감사합니다! –

+0

@matthias 당신은 removeRow 메서드에서 전달하는 뷰가 무엇인지 말해 줄 수 있습니까? 목록보기 또는 내 레이아웃 xml에서 부풀려 내 루트 뷰입니다! – k2ibegin

1

내가 이것을 위해 만든 ListView를 사용해 볼 수 있습니다. Github에 있습니다.

+0

감사합니다, 좋은 코드! –

관련 문제