ちょっと私は同様の問題を抱えていて、このように解決しました。
Chet Haase がこの devbyte で示したものを使用しました: http://www.youtube.com/watch?v=YCHNAi9kJI4
これは Roman のコードと非常に似ていますが、ここでは ViewTreeObserver を使用しているため、アダプターからアイテムを削除した後、リストが再描画される前に、アニメーションでギャップを埋める時間があり、ちらつきません。もう 1 つの違いは、ListView 自体ではなく、アダプター内のリストの各ビュー (アイテム) にリスナーを設定することです。
だから私のコードのサンプル:
これは ListActivity の onCreate です。ここでは、リスナーをアダプターに特別なものは何も渡しません。
ListAdapterTouchListener listAdapterTouchListener = new ListAdapterTouchListener(getListView());
listAdapter = new ListAdapter(this,null,false,listAdapterTouchListener);
これは ListAdapter の一部です (CursorAdapter を拡張するのは私自身のアダプターです)。コンストラクターでリスナーを渡します。
private View.OnTouchListener onTouchListener;
public ListAdapter(Context context, Cursor c, boolean autoRequery,View.OnTouchListener listener) {
super(context, c, autoRequery);
onTouchListener = listener;
}
次に、 newView メソッドでビューに設定します。
@Override
public View newView(final Context context, Cursor cursor, ViewGroup parent) {
View view = layoutInflater.inflate(R.layout.list_item,parent,false);
// here should be some viewholder magic to make it faster
view.setOnTouchListener(onTouchListener);
return view;
}
リスナーは、ビデオに示されているコードとほとんど同じです。backgroundcontainer は使用しませんが、それは私の選択です。したがって、animateRemoval には興味深い部分があります。次のとおりです。
private void animateRemoval(View viewToRemove){
for(int i=0;i<listView.getChildCount();i++){
View child = listView.getChildAt(i);
if(child!=viewToRemove){
// since I don't have stableIds I use the _id from the sqlite database
// I'm adding the id to the viewholder in the bindView method in the ListAdapter
ListAdapter.ViewHolder viewHolder = (ListAdapter.ViewHolder)child.getTag();
long itemId = viewHolder.id;
itemIdTopMap.put(itemId, child.getTop());
}
}
// I'm using content provider with LoaderManager in the activity because it's more efficient, I get the id from the viewholder
ListAdapter.ViewHolder viewHolder = (ListAdapter.ViewHolder)viewToRemove.getTag();
long removeId = viewHolder.id;
//here you remove the item
listView.getContext().getContentResolver().delete(Uri.withAppendedPath(MyContentProvider.CONTENT_ID_URI_BASE,Long.toString(removeId)),null,null);
// after the removal get a ViewTreeObserver, so you can set a PredrawListener
// the rest of the code is pretty much the same as in the sample shown in the video
final ViewTreeObserver observer = listView.getViewTreeObserver();
observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
observer.removeOnPreDrawListener(this);
boolean firstAnimation = true;
for(int i=0;i<listView.getChildCount();i++){
final View child = listView.getChildAt(i);
ListAdapter.ViewHolder viewHolder = (ListAdapter.ViewHolder)child.getTag();
long itemId = viewHolder.id;
Integer startTop = itemIdTopMap.get(itemId);
int top = child.getTop();
if(startTop!=null){
if (startTop!=top) {
int delta=startTop-top;
child.setTranslationY(delta);
child.animate().setDuration(MOVE_DURATION).translationY(0);
if(firstAnimation){
child.animate().setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
swiping=false;
listView.setEnabled(true);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
firstAnimation=false;
}
}
}else{
int childHeight = child.getHeight()+listView.getDividerHeight();
startTop = top+(i>0?childHeight:-childHeight);
int delta = startTop-top;
child.setTranslationY(delta);
child.animate().setDuration(MOVE_DURATION).translationY(0);
if(firstAnimation){
child.animate().setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
swiping=false;
listView.setEnabled(true);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
firstAnimation=false;
}
}
}
itemIdTopMap.clear();
return true;
}
});
}
これがお役に立てば幸いです。私にとってはうまく機能しています。あなたは本当にdevbyteを見るべきです、それは私を大いに助けました!