使用幻灯片删除项目列表视图 – 与Gmail一样

我正在开发一个列表视图中的商店列表的应用程序。 我需要当我滑动listview的项目向右(或左),这个项目应该从列表视图中删除。

我有我的列表视图,只需要执行它的function。

提前致谢。

这是我如何实现这一效果。 我们有一个ListView lvSimple ,我们添加onTouchListener到我们的lvSimple 。 这是我的工作代码。

 float historicX = Float.NaN, historicY = Float.NaN; static final int DELTA = 50; enum Direction {LEFT, RIGHT;} ... ListView lvSimple = (ListView) findViewById(R.id.linLayout); ... lvSimple.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: historicX = event.getX(); historicY = event.getY(); break; case MotionEvent.ACTION_UP: if (event.getX() - historicX < -DELTA) { FunctionDeleteRowWhenSlidingLeft(); return true; } else if (event.getX() - historicX > DELTA) { FunctionDeleteRowWhenSlidingRight(); return true; } break; default: return false; } return false; } }); 

函数FunctionDeleteRowWhenSlidingLeft()在我们向左滑动的时候调用, FunctionDeleteRowWhenSlidingRight() – 分别向右。 在这个function中,你需要粘贴animation代码。

通过Android-Developer在gist.github.com上指向Roman Nurik的代码。 此代码已过时。 他使用这个Swipe来closures他的开源项目Dash Clock中的监听器。

在使用Gist.github.com中的代码之前,您应该知道一些事情。

  1. gist.Github中过时的代码对触摸非常敏感。 如果不断点击ListView中的项目,它将被删除。 在更新的代码中,他确定了这个投掷灵敏度。
  2. 如果您在ListView中声明了分隔符,则此侦听器无法正常工作。 如果你想要分隔符,在ListItem布局中声明它们。
  3. 此代码仍处于testing阶段 。 买者自负。

所以我build议使用更新的代码。 你可以在这里find更新的源代码。

你应该考虑的另一个select是使用Tim Roes的EnhancedListView库。 [Update – 8/1/2015]随着RecycleView的推出,这个库已经被弃用了。

前面提到的Roman Nurik的SwipeToDismiss监听器需要API等级12或更高。 杰克·沃顿(Jake Wharton)将此代码移植到SwipeToDismissNOA中以支持所有API级别。

Tim Roes进一步扩展了这个库以支持撤消function。

我用macloving写了一个答案。 现在它正在工作,但只有你所有的孩子都有相同的身高才行。

 listView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub switch (event.getAction()) { case MotionEvent.ACTION_DOWN: historicX = event.getX(); historicY = event.getY(); return false; case MotionEvent.ACTION_UP: if (listView.getChildAt(0) != null) { int heightOfEachItem = haveListView.getChildAt(0).getHeight(); int heightOfFirstItem = -haveListView.getChildAt(0).getTop() + haveListView.getFirstVisiblePosition()*heightOfEachItem; //IF YOU HAVE CHILDS IN LIST VIEW YOU START COUNTING //listView.getChildAt(0).getTop() will see top of child showed in screen //Dividing by height of view, you get how many views are not in the screen //It needs to be Math.ceil in this case because it sometimes only shows part of last view final int firstPosition = (int) Math.ceil(heightOfFirstItem / heightOfEachItem); // This is the same as child #0 //Here you get your List position, use historic Y to get where the user went first final int wantedPosition = (int) Math.floor((historicY - haveListView.getChildAt(0).getTop()) / heightOfEachItem) + firstPosition; //Here you get the actually position in the screen final int wantedChild = wantedPosition - firstPosition; //Depending on delta, go right or left if (event.getX() - historicX < -DELTA) { //If something went wrong, we stop it now if (wantedChild < 0 || wantedChild >= List.size()|| wantedChild >= listView.getChildCount()) { return true; } //Start animation with 500 miliseconds of time listView.getChildAt(wantedChild).startAnimation(outToLeftAnimation(500)); //after 500 miliseconds remove from List the item and update the adapter. new java.util.Timer().schedule( new java.util.TimerTask() { @Override public void run() { List.remove(wantedPosition); updateAdapter(); } }, 500 ); return true; } else if (event.getX() - historicX > DELTA) { //If something went wrong, we stop it now if (wantedChild < 0 || wantedChild >= List.size() || wantedChild >= listView.getChildCount()) { return true; } //Start animation with 500 miliseconds of time listView.getChildAt(wantedChild).startAnimation(outToRightAnimation(500)); //after 500 miliseconds remove from List the item and update the adapter. new java.util.Timer().schedule( new java.util.TimerTask() { @Override public void run() { List.remove(wantedPosition); updateAdapter(); } }, 500 ); return true; } } return true; default: return false; } } }); 

animation有这个function:

 private Animation outToLeftAnimation(int duration) { Animation outtoLeft = new TranslateAnimation( Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); outtoLeft.setDuration(duration); outtoLeft.setInterpolator(new AccelerateInterpolator()); return outtoLeft; } private Animation outToRightAnimation(int duration) { Animation outtoRight = new TranslateAnimation( Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, +1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); outtoRight.setDuration(duration); outtoRight.setInterpolator(new AccelerateInterpolator()); return outtoRight; } 

我正在尝试这个,直到现在我还没有看到错误,如果有人可以尝试以及将是好的。