當前位置:首頁 » 安卓系統 » android滑動刪除listview

android滑動刪除listview

發布時間: 2022-07-23 17:52:00

『壹』 為什麼 Android 的應用上較少左(右)劃刪除,大多是長按刪除

Android 應用少採用向左向右滑動刪除,大多數為長按刪除的原因如下:

  1. 向左向右滑動,需要給每個listview的item單獨的加上很多代碼來控制顯示和隱藏文字,更容易出現bug。

  2. 長按刪除這一操作,是從android系統推出以來就有的功能,便於用戶操作,積累了操作習慣。

Android點擊事件分為點擊事件和長按事件,兩個事件可以單獨進行相應的,底層就是識別接觸點,回調執行相應的業務邏輯。

『貳』 android怎樣選中listview中一行進行刪除

AndroidActivity生命周期

onStart()與onResume()有什麼區別?

onStart()是activity界面被顯示出來的時候執行的,但不能與它交互;

onResume()是當該activity與用戶能進行交互時被執行,用戶可以獲得activity的焦點,能夠與用戶交互。

Activity啟動流程

startActivity最終都會調用startActivityForResult,通過ActivityManagerProxy調用system_server進程中ActivityManagerService的startActvity方法,如果需要啟動的Activity所在進程未啟動,則調用Zygote孵化應用進程,進程創建後會調用應用的ActivityThread的main方法,main方法調用attach方法將應用進程綁定到ActivityManagerService(保存應用的ApplicationThread的代理對象)並開啟loop循環接收消息。ActivityManagerService通過ApplicationThread的代理發送Message通知啟動Activity,ActivityThread內部Handler處理handleLaunchActivity,依次調用performLaunchActivity,handleResumeActivity(即activity的onCreate,onStart,onResume)。

深入理解Activity啟動流程

Android類載入器

Android平台上虛擬機運行的是Dex位元組碼,一種對class文件優化的產物,傳統Class文件是一個Java源碼文件會生成一個.class文件,而Android是把所有Class文件進行合並,優化,然後生成一個最終的class.dex,目的是把不同class文件重復的東西只需保留一份,如果我們的Android應用不進行分dex處理,最後一個應用的apk只會有一個dex文件。

Android中常用的有兩種類載入器,DexClassLoader和PathClassLoader,它們都繼承於BaseDexClassLoader。區別在於調用父類構造器時,DexClassLoader多傳了一個optimizedDirectory參數,這個目錄必須是內部存儲路徑,用來緩存系統創建的Dex文件。而PathClassLoader該參數為null,只能載入內部存儲目錄的Dex文件。所以我們可以用DexClassLoader去載入外部的apk。

Android消息機制

應用啟動是從ActivityThread的main開始的,先是執行了Looper.prepare(),該方法先是new了一個Looper對象,在私有的構造方法中又創建了MessageQueue作為此Looper對象的成員變數,Looper對象通過ThreadLocal綁定MainThread中;
當我們創建Handler子類對象時,在構造方法中通過ThreadLocal獲取綁定的Looper對象,並獲取此Looper對象的成員變數MessageQueue作為該Handler對象的成員變數;
在子線程中調用上一步創建的Handler子類對象的sendMesage(msg)方法時,在該方法中將msg的target屬性設置為自己本身,同時調用成員變數MessageQueue對象的enqueueMessag()方法將msg放入MessageQueue中;
主線程創建好之後,會執行Looper.loop()方法,該方法中獲取與線程綁定的Looper對象,繼而獲取該Looper對象的成員變數MessageQueue對象,並開啟一個會阻塞(不佔用資源)的死循環,只要MessageQueue中有msg,就會獲取該msg,並執行msg.target.dispatchMessage(msg)方法(msg.target即上一步引用的handler對象),此方法中調用了我們第二步創建handler子類對象時覆寫的handleMessage()方法,之後將該msg對象存入回收池;
Looper.loop()為什麼不會阻塞主線程
Android是基於事件驅動的,即所有Activity的生命周期都是通過Handler事件驅動的。loop方法中會調用MessageQueue的next方法獲取下一個message,當沒有消息時,基於Linux pipe/epoll機制會阻塞在loop的queue.next()中的nativePollOnce()方法里,並不會消耗CPU。

IdleHandler (閑時機制)

IdleHandler是一個回調介面,可以通過MessageQueue的addIdleHandler添加實現類。當MessageQueue中的任務暫時處理完了(沒有新任務或者下一個任務延時在之後),這個時候會回調這個介面,返回false,那麼就會移除它,返回true就會在下次message處理完了的時候繼續回調。

同步屏障機制(sync barrier)

同步屏障可以通過MessageQueue.postSyncBarrier函數來設置。該方法發送了一個沒有target的Message到Queue中,在next方法中獲取消息時,如果發現沒有target的Message,則在一定的時間內跳過同步消息,優先執行非同步消息。再換句話說,同步屏障為Handler消息機制增加了一種簡單的優先順序機制,非同步消息的優先順序要高於同步消息。在創建Handler時有一個async參數,傳true表示此handler發送的時非同步消息。ViewRootImpl.scheleTraversals方法就使用了同步屏障,保證UI繪制優先執行。

View的繪制原理

View的繪制從ActivityThread類中Handler的處理RESUME_ACTIVITY事件開始,在執行performResumeActivity之後,創建Window以及DecorView並調用WindowManager的addView方法添加到屏幕上,addView又調用ViewRootImpl的setView方法,最終執行

『叄』 如何去掉listview的滾動效果

package com.example.slidecutlistview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Scroller;

/**
*
* @author xiaanming
*
*/
public class SlideCutListView extends ListView {
/**
* 當前滑動的ListViewposition
*/
private int slidePosition;
/**
* 手指按下X的坐標
*/
private int downY;
/**
* 手指按下Y的坐標
*/
private int downX;
/**
* 屏幕寬度
*/
private int screenWidth;
/**
* ListView的item
*/
private View itemView;
/**
* 滑動類
*/
private Scroller scroller;
private static final int SNAP_VELOCITY = 600;
/**
* 速度追蹤對象
*/
private VelocityTracker velocityTracker;
/**
* 是否響應滑動,默認為不響應
*/
private boolean isSlide = false;
/**
* 認為是用戶滑動的最小距離
*/
private int mTouchSlop;
/**
* 移除item後的回調介面
*/
private RemoveListener mRemoveListener;
/**
* 用來指示item滑出屏幕的方向,向左或者向右,用一個枚舉值來標記
*/
private RemoveDirection removeDirection;

// 滑動刪除方向的枚舉值
public enum RemoveDirection {
RIGHT, LEFT;
}

public SlideCutListView(Context context) {
this(context, null);
}

public SlideCutListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public SlideCutListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
screenWidth = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth();
scroller = new Scroller(context);
mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
}

/**
* 設置滑動刪除的回調介面
* @param removeListener
*/
public void setRemoveListener(RemoveListener removeListener) {
this.mRemoveListener = removeListener;
}

/**
* 分發事件,主要做的是判斷點擊的是那個item, 以及通過postDelayed來設置響應左右滑動事件
*/
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
addVelocityTracker(event);

// 假如scroller滾動還沒有結束,我們直接返回
if (!scroller.isFinished()) {
return super.dispatchTouchEvent(event);
}
downX = (int) event.getX();
downY = (int) event.getY();

slidePosition = pointToPosition(downX, downY);

// 無效的position, 不做任何處理
if (slidePosition == AdapterView.INVALID_POSITION) {
return super.dispatchTouchEvent(event);
}

// 獲取我們點擊的item view
itemView = getChildAt(slidePosition - getFirstVisiblePosition());
break;
}
case MotionEvent.ACTION_MOVE: {
if (Math.abs(getScrollVelocity()) > SNAP_VELOCITY
|| (Math.abs(event.getX() - downX) > mTouchSlop && Math
.abs(event.getY() - downY) < mTouchSlop)) {
isSlide = true;

}
break;
}
case MotionEvent.ACTION_UP:
recycleVelocityTracker();
break;
}

return super.dispatchTouchEvent(event);
}

/**
* 往右滑動,getScrollX()返回的是左邊緣的距離,就是以View左邊緣為原點到開始滑動的距離,所以向右邊滑動為負值
*/
private void scrollRight() {
removeDirection = RemoveDirection.RIGHT;
final int delta = (screenWidth + itemView.getScrollX());
// 調用startScroll方法來設置一些滾動的參數,我們在computeScroll()方法中調用scrollTo來滾動item
scroller.startScroll(itemView.getScrollX(), 0, -delta, 0,
Math.abs(delta));
postInvalidate(); // 刷新itemView
}

/**
* 向左滑動,根據上面我們知道向左滑動為正值
*/
private void scrollLeft() {
removeDirection = RemoveDirection.LEFT;
final int delta = (screenWidth - itemView.getScrollX());
// 調用startScroll方法來設置一些滾動的參數,我們在computeScroll()方法中調用scrollTo來滾動item
scroller.startScroll(itemView.getScrollX(), 0, delta, 0,
Math.abs(delta));
postInvalidate(); // 刷新itemView
}

/**
* 根據手指滾動itemView的距離來判斷是滾動到開始位置還是向左或者向右滾動
*/
private void scrollByDistanceX() {
// 如果向左滾動的距離大於屏幕的二分之一,就讓其刪除
if (itemView.getScrollX() >= screenWidth / 2) {
scrollLeft();
} else if (itemView.getScrollX() <= -screenWidth / 2) {
scrollRight();
} else {
// 滾回到原始位置,為了偷下懶這里是直接調用scrollTo滾動
itemView.scrollTo(0, 0);
}

}

/**
* 處理我們拖動ListView item的邏輯
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (isSlide && slidePosition != AdapterView.INVALID_POSITION) {
(true);
addVelocityTracker(ev);
final int action = ev.getAction();
int x = (int) ev.getX();
switch (action) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:

MotionEvent cancelEvent = MotionEvent.obtain(ev);
cancelEvent.setAction(MotionEvent.ACTION_CANCEL |
(ev.getActionIndex()<< MotionEvent.ACTION_POINTER_INDEX_SHIFT));
onTouchEvent(cancelEvent);

int deltaX = downX - x;
downX = x;

// 手指拖動itemView滾動, deltaX大於0向左滾動,小於0向右滾
itemView.scrollBy(deltaX, 0);

return true; //拖動的時候ListView不滾動
case MotionEvent.ACTION_UP:
int velocityX = getScrollVelocity();
if (velocityX > SNAP_VELOCITY) {
scrollRight();
} else if (velocityX < -SNAP_VELOCITY) {
scrollLeft();
} else {
scrollByDistanceX();
}

recycleVelocityTracker();
// 手指離開的時候就不響應左右滾動
isSlide = false;
break;
}
}

//否則直接交給ListView來處理onTouchEvent事件
return super.onTouchEvent(ev);
}

@Override
public void computeScroll() {
// 調用startScroll的時候scroller.computeScrollOffset()返回true,
if (scroller.computeScrollOffset()) {
// 讓ListView item根據當前的滾動偏移量進行滾動
itemView.scrollTo(scroller.getCurrX(), scroller.getCurrY());

postInvalidate();

// 滾動動畫結束的時候調用回調介面
if (scroller.isFinished()) {
if (mRemoveListener == null) {
throw new NullPointerException("RemoveListener is null, we should called setRemoveListener()");
}

itemView.scrollTo(0, 0);
mRemoveListener.removeItem(removeDirection, slidePosition);
}
}
}

/**
* 添加用戶的速度跟蹤器
*
* @param event
*/
private void addVelocityTracker(MotionEvent event) {
if (velocityTracker == null) {
velocityTracker = VelocityTracker.obtain();
}

velocityTracker.addMovement(event);
}

/**
* 移除用戶速度跟蹤器
*/
private void recycleVelocityTracker() {
if (velocityTracker != null) {
velocityTracker.recycle();
velocityTracker = null;
}
}

/**
* 獲取X方向的滑動速度,大於0向右滑動,反之向左
*
* @return
*/
private int getScrollVelocity() {
velocityTracker.computeCurrentVelocity(1000);
int velocity = (int) velocityTracker.getXVelocity();
return velocity;
}

/**
*
* 當ListView item滑出屏幕,回調這個介面
* 我們需要在回調方法removeItem()中移除該Item,然後刷新ListView
*
* @author xiaanming
*
*/
public interface RemoveListener {
public void removeItem(RemoveDirection direction, int position);
}

}

『肆』 Android中listview item 側滑刪除怎麼搞

Android中listview item 側滑刪除有現成的開源框架,github上搜索listView即有一大堆,這里也有示例代碼。

『伍』 Android的listview的點擊和滑動效果沖突了

ViewDragHelper.Callback做滑動效果,你是不是在這里屏蔽了onTouch

如果這里重寫了onTouch 你要在onTouch里返回false這樣,事件才能繼續傳遞

還有,你想實現listView item的動畫,或者滑動刪除,左右滑動操作的話,建議你直接用開源框架

我這里給你上傳一份,關於listView的各種動畫,各種控制項,你可以直接用這些源代碼了

『陸』 如何清空android ListView控制項的內容

【清空android ListView控制項的內容方法】:

1,當我們要載入item的時候,首先把list清空

list.clear();

適配器

adapter1=newArrayAdapter<String>(getApplicationContext(),android.R.layout.simple_list_item_1,list);

listView.setAdapter(adapter1);

這樣載入以後就把Listview中的數據清空了。

2、然後再載入我們想要的數據

list.add("a");

list.add("c");

list.add("b");

list.add("a");

list.add("c");

list.add("b");

適配器

adapter1=newArrayAdapter<String>

(getApplicationContext(),android.R.layout.simple_list_item_1,list);

listView.setAdapter(adapter1);


adapter1=newArrayAdapter<String>

(getApplicationContext(),android.R.layout.simple_list_item_1,list);


listView.setAdapter(adapter1);

『柒』 android怎樣選中listview中一行進行刪除

聲明這個ListvIew

/生成動態數組,加入數據

listItem = new ArrayList<HashMap<String, Object>>();

map = new HashMap<String, Object>();

for(int i=0;i<10;i++)

{

// 後台數據

HashMap<String, Object> map = new HashMap<String, Object>();

map.put("ItemImage", R.drawable.checked);來下

map.put("ItemTitle", "Level ");

map.put("ItemText", "Finished in 1 Min 54 Secs, 70 Moves!");

listItem.add(map);

}

list.setOnItemClickListener(new OnItemClickListener()

{

@Override

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3)

{

刪除操作

listItem.remove(position);//選擇行的位置

listItemAdapter.notifyDataSetChanged();

list.invalidate();

listview會刪除選擇的行,重新更新

}

});

『捌』 Android ListView Item滑動刪除的效果問題

GOOGLE下SwipeListView

『玖』 Android 4.0以上怎麼實現拖動Listview Item 到不見的位置就刪除!

效果圖上下吧。。

『拾』 為什麼 Android 的應用上較少左劃刪除,大多是長按刪除

Android 應用少採用向左向右滑動刪除,大多數為長按刪除的原因如下: 向左向右滑動,需要給每個listview的item單獨的加上很多代碼來控制顯示和隱藏文字,更容易出現bug。 長按刪除這一操作,是從android系統推出以來就有的功能,便於用戶操作,積累了操作習慣。 Android點擊事件分為點擊事件和長按事件,兩個事件可以單獨進行相應的,底層就是識別接觸點,回調執行相應的業務邏輯。

熱點內容
win7ftp用戶名和密碼設置 發布:2025-01-22 17:46:48 瀏覽:221
三表聯查的sql語句 發布:2025-01-22 17:27:13 瀏覽:418
安卓怎麼解壓分卷壓縮 發布:2025-01-22 17:24:59 瀏覽:721
歐姆龍plc編程語言 發布:2025-01-22 17:21:48 瀏覽:396
和值編程 發布:2025-01-22 17:20:07 瀏覽:518
微信青少年模式獨立密碼是什麼 發布:2025-01-22 16:52:06 瀏覽:590
騰訊雲伺服器怎麼購買 發布:2025-01-22 16:45:01 瀏覽:631
天貓怎麼上傳視頻 發布:2025-01-22 16:40:02 瀏覽:728
安卓如何把抖音評論換成黑色 發布:2025-01-22 16:30:57 瀏覽:702
連接池Java 發布:2025-01-22 16:28:27 瀏覽:260