




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發技術】怎么在Android中實現一個左滑刪除列表功能
怎么在Android中實現一個左滑刪除列表功能?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。1、布局文件view_left_slide_remove.xml包含一個RelativeLayout和TextView,RelativeLayout是實際界面,TextView是刪除按鈕。<?xml
version="1.0"
encoding="utf-8"?>
<RelativeLayout
xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="40dp">
<RelativeLayout
android:id="@+id/view_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<TextView
android:id="@+id/tv_remove"
android:layout_width="@dimen/left_slide_remove_width"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:gravity="center"
android:text="刪除"
android:textSize="16sp"
android:textColor="@color/white"
android:background="#ffff4b30"
android:visibility="gone"/>
</RelativeLayout>2、自定義AdapterLeftSlideRemoveAdapter類實現了BaseAdapter。在getView方法中引用了view_left_slide_remove布局,提供getSubView來導入真正的布局。OnItemRemoveListener是刪除監聽器。public
static
abstract
class
LeftSlideRemoveAdapter
extends
BaseAdapter
{
protected
Context
mContext;
private
OnItemRemoveListener
mListener;
public
LeftSlideRemoveAdapter(Context
context)
{
this.mContext
=
context;
}
@Override
public
final
View
getView(final
int
position,
View
convertView,
ViewGroup
parent)
{
ViewHolder
holder;
if
(convertView
==
null)
{
LayoutInflater
inflater
=
LayoutInflater.from(mContext);
convertView
=
inflater.inflate(R.layout.view_left_slide_remove,
parent,
false);
holder
=
new
ViewHolder();
holder.viewContent
=
(RelativeLayout)
convertView.findViewById(R.id.view_content);
holder.tvRmove
=
(TextView)
convertView.findViewById(R.id.tv_remove);
convertView.setTag(holder);
//
viewChild是實際的界面
holder.viewChild
=
getSubView(position,
null,
parent);
holder.viewContent.addView(holder.viewChild);
}
else
{
holder
=
(ViewHolder)
convertView.getTag();
getSubView(position,
holder.viewChild,
parent);
}
holder.tvRmove.setOnClickListener(new
View.OnClickListener(){
@Override
public
void
onClick(View
v)
{
if
(mListener
!=
null)
{
mListener.onItemRemove(position);
notifyDataSetChanged();
}
}
});
return
convertView;
}
public
abstract
View
getSubView(int
position,
View
convertView,
ViewGroup
parent);
}
private
static
class
ViewHolder
{
RelativeLayout
viewContent;
View
viewChild;
View
tvRmove;
}
public
static
interface
OnItemRemoveListener
{
public
void
onItemRemove(int
position);
}3、自定義左滑刪除列表在dispatchTouchEvent方法里面捕捉MotionEvent事件。在onTouchEvent方法里面滑動界面。VelocityTracker類記錄手勢。Scroller類進行滑動操作。public
class
LeftSlideRemoveListView
extends
ListView
{
private
final
static
int
SNAP_VELOCITY
=
600;
private
Scroller
mScroller;
private
VelocityTracker
mVelocityTracker;
private
int
mTouchSlop;
private
boolean
mIsSlide
=
false;
private
int
mDelta
=
0;
private
int
mDownX;
private
int
mDownY;
private
int
mMaxDistence;
private
int
mSlidePosition
=
INVALID_POSITION;
private
OnItemRemoveListener
adapterListener;
private
OnItemRemoveListener
mRemoveListener
=
new
OnItemRemoveListener()
{
@Override
public
void
onItemRemove(int
position)
{
if
(adapterListener
!=
null)
{
adapterListener.onItemRemove(position);
}
clear();
mSlidePosition
=
INVALID_POSITION;
}
};
private
LeftSlideRemoveAdapter
mRemoveAdapter;
private
View
mCurrentContentView,
mCurrentRemoveView;
public
LeftSlideRemoveListView(Context
context)
{
this(context,
null);
}
public
LeftSlideRemoveListView(Context
context,
AttributeSet
attrs)
{
super(context,
attrs);
mScroller
=
new
Scroller(context);
mTouchSlop
=
ViewConfiguration.get(getContext()).getScaledTouchSlop();
mMaxDistence
=
context.getResources().getDimensionPixelSize(
R.dimen.left_slide_remove_width);
}
@Override
public
boolean
dispatchTouchEvent(MotionEvent
ev)
{
switch
(ev.getAction())
{
case
MotionEvent.ACTION_DOWN:
addVelocityTracker(ev);
if
(!mScroller.isFinished())
{
return
super.dispatchTouchEvent(ev);
}
//
起始位置,當前position
mDownX
=
(int)
ev.getX();
mDownY
=
(int)
ev.getY();
int
position
=
pointToPosition(mDownX,
mDownY);
if
(position
==
mSlidePosition)
break;
mSlidePosition
=
position;
if
(mSlidePosition
==
INVALID_POSITION
)
{
return
super.dispatchTouchEvent(ev);
}
//
恢復狀態
clear();
//
獲取當前界面
View
childView
=
getChildAt(mSlidePosition
-
getFirstVisiblePosition());
mCurrentContentView
=
childView.findViewById(R.id.view_content);
mCurrentRemoveView
=
childView.findViewById(R.id.tv_remove);
break;
case
MotionEvent.ACTION_MOVE:
if
(mCurrentContentView
==
null)
break;
if
(Math.abs(getScrollVelocity())
>
SNAP_VELOCITY
||
(Math.abs(ev.getX()
-
mDownX)
>
mTouchSlop
&&
Math.abs(ev.getY()
-
mDownY)
<
mTouchSlop))
{
//
開始滑動
mIsSlide
=
true;
}
break;
case
MotionEvent.ACTION_UP:
if
(mCurrentContentView
==
null
&&
mIsSlide)
break;
//
如果左滑小于4/5,按鈕不顯示
if
(mDelta
<
mMaxDistence
*
4
/
5)
{
mCurrentRemoveView.setVisibility(View.GONE);
scrollRight();
}
else
if
(mDelta
<
mMaxDistence)
{
scrollLeft();
}
recycleVelocityTracker();
mIsSlide
=
false;
break;
}
return
super.dispatchTouchEvent(ev);
}
@Override
public
boolean
onTouchEvent(MotionEvent
ev)
{
if
(mIsSlide
&&
mSlidePosition
!=
INVALID_POSITION)
{
final
int
action
=
ev.getAction();
int
x
=
(int)
ev.getX();
switch
(action)
{
case
MotionEvent.ACTION_MOVE:
addVelocityTracker(ev);
int
deltaX
=
mDownX
-
x;
mDownX
=
x;
mDelta
+=
deltaX;
if
(mDelta
<
0)
{
mCurrentContentView.scrollTo(0,
0);
mDelta
=
0;
mCurrentRemoveView.setVisibility(View.GONE);
}
else
if
(mDelta
>=
mMaxDistence)
{
mDelta
=
mMaxDistence;
mCurrentContentView.scrollTo(mMaxDistence,
0);
mCurrentRemoveView.setVisibility(View.VISIBLE);
mCurrentRemoveView.setTranslationX(0);
}
else
{
mCurrentContentView.scrollBy(deltaX,
0);
mCurrentRemoveView.setVisibility(View.VISIBLE);
mCurrentRemoveView.setTranslationX(mMaxDistence
-
mDelta);
}
break;
}
return
true;
}
return
super.onTouchEvent(ev);
}
//
右滑
private
void
scrollRight()
{
final
int
delta
=
mDelta;
mScroller.startScroll(delta,
0,
-delta,
0,
Math.abs(delta));
mDelta
=
0;
postInvalidate();
}
//
左滑
private
void
scrollLeft()
{
final
int
delta
=
mMaxDistence
-
mDelta;
mScroller.startScroll(mDelta,
0,
delta,
0,
Math.abs(delta));
mDelta
=
mMaxDistence;
postInvalidate();
}
@Override
public
void
computeScroll()
{
if
(mSputeScrollOffset())
{
mCurrentContentView.scrollTo(mScroller.getCurrX(),
mScroller.getCurrY());
mCurrentRemoveView.setTranslationX(mMaxDistence
-
mScroller.getCurrX());
postInvalidate();
if
(mScroller.isFinished())
{
mCurrentContentView.scrollTo(mDelta,
0);
mCurrentRemoveView.setTranslationX(0);
}
}
}
private
void
addVelocityTracker(MotionEvent
event)
{
if
(mVelocityTracker
==
null)
{
mVelocityTracker
=
VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event);
}
private
int
getScrollVelocity()
{
mVelocityTputeCurrentVelocity(1000);
int
velocity
=
(int)
mVelocityTracker.getXVelocity();
return
velocity;
}
private
void
recycleVelocityTracker()
{
if
(mVelocityTracker
!=
null)
{
mVelocityTracker.recycle();
mVelocityTracker
=
null;
}
}
private
void
clear()
{
if
(mCurrentContentView
!=
null)
{
mDelta
=
0;
mCurrentContentView.scrollTo(0,
0);
mCurrentContentView
=
null;
mCurrentRemoveView.setVisibility(View.GONE);
mCurrentRemoveView
=
null;
}
}
@Override
public
void
setAdapter(ListAdapter
adapter)
{
if
(adapter
instanceof
LeftSlideRemoveAdapter)
{
super.setAdapter(adapter);
mRemoveAdapter
=
(LeftSlideRemoveAdapter)
adapter;
mRemoveAdapter.mListener
=
mRemoveListener;
}
else
{
throw
new
IllegalArgumentException("Must
be
LeftSlideRemoveAdapter");
}
}
public
void
setOnItemRemoveListener(OnItemRemoveListener
listener)
{
adapterListener
=
listener;
}
}4、測試例子ContractAdapter繼承LeftSlideRemoveAdapter類。LeftSlideRemoveActivity中使用LeftSlideRemoveListView類。public
class
LeftSlideRemoveActivity
extends
Activity
{
private
List<Map<String,
String>>
mContentList
=
new
ArrayList<Map<String,
String>>();
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_left_slide_remove);
Map<String,
String>
item
=
new
HashMap<String,
String>();
item.put("name",
"Peter");
item.put("address",
"ShangHai");
mContentList.add(item);
item
=
new
HashMap<String,
String>();
item.put("name",
"Lily");
item.put("address",
"BeiJing");
mContentList.add(item);
item
=
new
HashMap<String,
String>();
item.put("name",
"Jack");
item.put("address",
"GuangZhou");
mContentList.add(item);
item
=
new
HashMap<String,
String>();
item.put("name",
"Mike");
item.put("address",
"ShengZhen");
mContentList.add(item);
LeftSlideRemoveListView
lv
=
(LeftSlideRemoveListView)
findViewById(R.id.id_listview);
lv.setAdapter(new
ContractAdapter(this));
lv.setOnItemRemoveListener(new
LeftSlideRemoveListView.OnItemRemoveListener()
{
@Override
public
void
onItemRemove(int
position)
{
mContentList.remove(position);
}
});
}
private
class
ContractAdapter
extends
LeftSlideRemoveListView.LeftSlideRemoveAdapter
{
public
ContractAdapter(Context
context)
{
super(context);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基因遞送效率提升-洞察及研究
- 柔性傳感器多模態傳感技術-洞察及研究
- 一次難忘的演講經歷演講稿分享7篇
- 我最自豪的一次小小成就事件作文4篇范文
- 生物學遺傳基因測試卷解析
- 我最尊敬的同學寫人作文(6篇)
- 《初中化學分子式記憶技巧與練習課程》
- 澳洲簽證面試題及答案
- 對老師表達敬意的抒情文7篇
- 記憶科技考試題及答案
- 2025至2030中國寺廟經濟市場深度調研與未來前景發展研究報告
- 金融監管沙盒模擬測試
- 《2025年拍賣師職業資格考試核心考點預測》
- 2025年全國低壓電工作業證(復審)考試練習題庫(600題)附答案
- 混凝土預制構件項目可行性研究報告參考范文
- 2025漳浦縣國企招聘考試題目及答案
- 低壓電工復審培訓
- 新能源汽車充電系統故障診斷與維修技術研究
- 護理典型案例分享
- 2025年GCP(藥物臨床試驗質量管理規范)相關知識考試題與答案
- 2019-2020學年廣東省中山市七年級下學期期末數學試卷-(含部分答案)
評論
0/150
提交評論