我正在開發一個應用程序與列表視圖中的店鋪列表。當我將listview
的項目向右(或向左)滑動時,我需要這個項目應該從列表視圖中刪除。刪除與幻燈片項目列表視圖 - 像Gmail
我有我的列表視圖,只需要執行它的功能。
在此先感謝。
我正在開發一個應用程序與列表視圖中的店鋪列表。當我將listview
的項目向右(或向左)滑動時,我需要這個項目應該從列表視圖中刪除。刪除與幻燈片項目列表視圖 - 像Gmail
我有我的列表視圖,只需要執行它的功能。
在此先感謝。
這就是我如何實現這種效果。我們有一個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()
- 分別權。在這個功能中,你需要粘貼動畫代碼。
Ohhhh,經過兩天的搜索和調試,它節省了我! 謝謝 –
但如何獲得幻燈片的索引?! –
list.setOnItemClickListener(新AdapterView.OnItemClickListener(){ 公共無效onItemClick(適配器視圖父視圖V,INT位置,長ID){ // DO的東西在這裏 SwipedPosition =位置; } }); – pukingminion
Answer Android-Developer指向Roman Nurik的代碼gist.github.com。此代碼已過時。他在他的開源項目Dash Clock中使用這個Swipe來關閉監聽器。
在使用Gist.github.com中的代碼之前,您應該知道一些事情。
因此,我建議使用更新的代碼。你可以找到更新源here。
我正在使用在您推薦的鏈接中找到的更新後的代碼,但我在聲明它時遇到了問題。每當我打電話給該行:「新的SwipeDismissListViewTouchListener.OnDismissCallback(){」它出現了,「SwipeDismissListViewTouchListener.OnDismissCallback無法解析爲類型」任何想法?不太確定解決方案 – Silmarilos
@Silmarilos使用新的SwipeDismissListViewTouchListener.DismissCallbacks()代替 – Blacklight
https://github.com/romannurik/Android-SwipeToDismiss/blob/master/src/com/example/android/swipedismiss/SwipeDismissTouchListener。 java – user3167086
您應該考慮的另一個選擇是使用Tim Roes的EnhancedListView庫。[更新日期2015/8/1]隨着RecycleView的推出,該庫已被棄用。
前面提到的Roman Nurik的SwipeToDismiss偵聽器需要API等級12或更高。傑克沃頓移植此代碼以支持SwipeToDismissNOA中的所有API級別。
Tim Roes將此庫進一步擴展爲支持還原功能。
INFO:EnhancedListView已棄用。 – iraSenthil
@iraSenthil那麼你現在在使用什麼或刷卡和刪除? SwipetoDismissNOA還是別的? – Darpan
我用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;
}
}
});
的動畫有這樣的功能:
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;
}
我想這一點,到現在爲止我還沒有看到錯誤的,如果有人可以嘗試也將是一件好事。
就像平板電腦一樣,您可以通過將任務從當前任務列表中滑動到左側或右側來刪除任務。 –
這裏是一個鏈接,可以顯示/指導你如何做到這一點:[刷卡解散](https://gist.github.com/2980593) 。 – hardartcore