android 继承ListView实现滑动删除功能.
生活随笔
收集整理的這篇文章主要介紹了
android 继承ListView实现滑动删除功能.
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在一些用戶體驗較好的應用上,可以經常遇見 ? 在ListView中 ?向左或向右滑動便可刪除那一項列表.具體實現 ?則是繼承ListView實現特定功能即可.(1). 新建 delete_button.xml文件 <?xml?version="1.0"?encoding="utf-8"?> <Button?xmlns:android="http://schemas.android.com/apk/res/android" ????android:layout_width="match_parent" ????android:id="@+id/btn_delete" ????android:layout_height="match_parent" ????android:background="#FF0000" ????android:textColor="#F8F8FF" ????android:text="刪除" ????android:orientation="vertical"?> </Button>??
很簡單的布局,一個按鈕,但這就是滑動時會出現的一個布局.(2). 創建MyListView繼承自 ListView. public?class?MyListView?extends?ListView?implements?OnTouchListener,OnGestureListener?{ ????private?GestureDetector?gestureDetector;???//監聽手勢的實例 ???? ????public?interface?OnDeleteListener{???????//將要刪除的某項位置??回調給?MainActivity進行處理 ????????void?onDelete(int?index?); ????} ????private?OnDeleteListener?mListener;??????//刪除監聽 ???? ????private?View?deleteButton;?????//刪除按鈕的視圖 ???? ????private?ViewGroup?itemLayout;???//需要操作項??的?ViewGroup對象 ???? ????private?int?selectedItem;???//選中位置 ???? ????private?boolean?isDeleteShown;???//是否有??刪除按鈕顯示 ????public?MyListView(Context?context,?AttributeSet?attrs)?{ ????????super(context,?attrs); ????????gestureDetector=new?GestureDetector(getContext(),this); ????????setOnTouchListener(this); ????} ????public?void?setOnDeleteListener(OnDeleteListener?l){ ????????this.mListener=l; ????} ???? ????@Override ????public?boolean?onTouch(View?v,?MotionEvent?event)?{ ????????if(isDeleteShown){ ????????????itemLayout.removeView(deleteButton); ????????????deleteButton=null; ????????????isDeleteShown=false; ????????????return?true; ????????} ????????else{ ????????????//如果在空白地方繼續滑動??,??禁止非法位置出現??刪除按鈕 ????????????if(AdapterView.INVALID_POSITION?==?pointToPosition((int)event.getX(),?(int)?event.getY()))?? ????????????{ ????????????????return?false; ????????????} ????????????selectedItem=pointToPosition((int)event.getX(),?(int)event.getY()); ????????????return?gestureDetector.onTouchEvent(event);?? ????????} ????} ????@Override ????public?boolean?onDown(MotionEvent?e)?{??//點擊按下事件 ????????if(!isDeleteShown){ ????????????selectedItem=pointToPosition((int)e.getX(),?(int)e.getY()); ????????} ????????return?false; ????} ????@Override ????public?boolean?onFling(MotionEvent?e1,?MotionEvent?e2,?float?x,??//手指滑動事件 ????????????float?y)?{ ????????if(!isDeleteShown&&Math.abs(x)>Math.abs(y)){ ????????????deleteButton=LayoutInflater.from(getContext()).inflate(R.layout.delete_button,null); ????????????deleteButton.setOnClickListener(new?OnClickListener()?{ ????????????????@Override ????????????????public?void?onClick(View?v)?{ ????????????????????itemLayout.removeView(deleteButton); ????????????????????deleteButton=null; ????????????????????isDeleteShown=false; ????????????????????mListener.onDelete(selectedItem); ????????????????} ????????????}); ????????????itemLayout=(ViewGroup)?getChildAt(selectedItem?-?getFirstVisiblePosition()); ?????????????RelativeLayout.LayoutParams?params?=?new?RelativeLayout.LayoutParams(?? ????????????????????????LayoutParams.WRAP_CONTENT,?LayoutParams.WRAP_CONTENT);?? ?????????????params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);?? ?????????????params.addRule(RelativeLayout.CENTER_VERTICAL);?? ?????????????itemLayout.addView(deleteButton,?params);?? ?????????????isDeleteShown=true; ????????} ????????return?false; ????} ????@Override ????public?void?onLongPress(MotionEvent?e)?{ ???????? ????} ????@Override ????public?boolean?onScroll(MotionEvent?arg0,?MotionEvent?arg1,?float?arg2, ????????????float?arg3)?{ ????????return?false; ????} ????@Override ????public?void?onShowPress(MotionEvent?arg0)?{ ???????? ????} ????@Override ????public?boolean?onSingleTapUp(MotionEvent?arg0)?{ ????????return?false; ????} ???? }這段代碼, ?在構造方法中創建了 GestureDetector的實例用于監聽手勢,注冊了touch事件,然后在onTouch進行判斷,如果刪除按鈕已經顯示了,將將它移除掉,否則就是用GestureDetector處理當前手勢.
當手指按下onGestureListener的onDown方法時,這里通過pointToPosition()方法判斷當前選中的是哪一行.當手指快速滑動時,會調用onFling()方法,在這里會去加載delete_button.xml這個布局,然后將刪除按鈕添加到當前選中的那一行item上。
這里刪除按鈕添加了一個點擊事件,當點擊了刪除按鈕時就會回調onDeleteListener的onDelete()方法,在回調方法中應該去處理具體的刪除操作。
(3)新建item項 <?xml?version="1.0"?encoding="utf-8"?>?? <RelativeLayout?xmlns:android="http://schemas.android.com/apk/res/android"?? ????android:layout_width="match_parent"?? ????android:layout_height="match_parent"?? ????android:descendantFocusability="blocksDescendants"?? ????android:orientation="vertical"?>?? ?? ????<TextView?? ????????android:id="@+id/tv"?? ????????android:layout_width="wrap_content"?? ????????android:layout_height="50dp"?? ????????android:layout_centerVertical="true"?? ????????android:gravity="left|center_vertical"?? ????????android:textColor="#000"?/>?? ?? </RelativeLayout>???
(4) ?適配器 public?class?MyAdapter?extends?ArrayAdapter<String>?{ ????public?MyAdapter(Context?context,?int?tvSourceId,List<String>?objects)?{ ????????super(context,?tvSourceId,objects); ????} ???? ????@Override ????public?View?getView(int?position,?View?convertView,?ViewGroup?parent)?{ ????????View?view; ????????if(convertView==null){ ????????????view=LayoutInflater.from(getContext()).inflate(R.layout.item,null); ????????} ????????else{ ????????????view=convertView; ????????} ????????TextView?tv=(TextView)?view.findViewById(R.id.tv); ????????tv.setText(getItem(position)); ????????return?view; ????} }?
(5) main.xml <RelativeLayout?xmlns:android="http://schemas.android.com/apk/res/android" ????xmlns:tools="http://schemas.android.com/tools" ????android:layout_width="match_parent" ????android:layout_height="match_parent" ????tools:context=".MainActivity"?> ????<com.example.listviewdeletedemo.MyListView? ????????android:id="@+id/mListView" ????????android:layout_width="match_parent" ????????android:layout_height="match_parent"> ????</com.example.listviewdeletedemo.MyListView> ???? </RelativeLayout>??
(6)最后初始化數據,處理onDelete方法中的刪除. public?class?MainActivity?extends?Activity?{ ????private?MyListView?mListView; ????private?MyAdapter?mAdapter; ????private?List<String>?contentList=new?ArrayList<String>();??//數據集 ???? ????@Override ????protected?void?onCreate(Bundle?savedInstanceState)?{ ????????super.onCreate(savedInstanceState); ????????requestWindowFeature(Window.FEATURE_NO_TITLE); ????????setContentView(R.layout.activity_main); ????????initList(); ????????mListView=(MyListView)?findViewById(R.id.mListView); ????????mListView.setOnDeleteListener(new?OnDeleteListener()?{ ????????????@Override ????????????public?void?onDelete(int?index)?{ ????????????????contentList.remove(index); ????????????????mAdapter.notifyDataSetChanged(); ????????????} ????????}); ????????mAdapter=new?MyAdapter(this,?0,?contentList); ????????mListView.setAdapter(mAdapter); ????} ?????private?void?initList()?{?? ????????????contentList.add("Content?Item?1");?? ????????????contentList.add("Content?Item?2");?? ????????????contentList.add("Content?Item?3");?? ????????????contentList.add("Content?Item?4");?? ????????????contentList.add("Content?Item?5");?? ????????????contentList.add("Content?Item?6");?? ????????????contentList.add("Content?Item?7");?? ????????????contentList.add("Content?Item?8");?? ????????????contentList.add("Content?Item?9");?? ????????????contentList.add("Content?Item?10");?? ????????????contentList.add("Content?Item?11");?? ????????????contentList.add("Content?Item?12");?? ????????????contentList.add("Content?Item?13");?? ????????????contentList.add("Content?Item?14");?? ????????????contentList.add("Content?Item?15");?? ????????????contentList.add("Content?Item?16");?? ????????????contentList.add("Content?Item?17");?? ????????????contentList.add("Content?Item?18");?? ????????????contentList.add("Content?Item?19");?? ????????????contentList.add("Content?Item?20");?? ????????}?? ???? }這樣,一個毫無BUG的滑動刪除就完成了.
來自為知筆記(Wiz)
轉載于:https://www.cnblogs.com/aibuli/p/d8bd3842a4ae78af0016af14e5ee0636.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的android 继承ListView实现滑动删除功能.的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 23个经典JDK设计模式(转)
- 下一篇: IOS sqlite数据库增删改查