自訂滑動刪除item的ListView。,itemlistview

來源:互聯網
上載者:User

自訂滑動刪除item的ListView。,itemlistview

首先繼承建立繼承ListView和實現OnTouchListener,OnGestureListener的類。

會使用到AbsList中的pointToPosition(int x, int y)方法,這個方法主要是根據點擊的位置擷取點擊行的在列表中的索引。

還有ViewGroup中的getChildAt(int index)方法,主要用於根據當前的索引擷取子控制項。這個(這個索引以可見螢幕頂端開始)。

之所以實現OnTouchListener,OnGestureListener。是因為OnGestureListener要擷取到OnTouchListener傳遞的事件。

package com.example.mylistview;import android.content.Context;import android.util.AttributeSet;import android.widget.ListView;import android.widget.RelativeLayout;import android.widget.Toast;import android.view.GestureDetector;import android.view.GestureDetector.OnGestureListener;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.view.ViewGroup;public class MyListView extends ListView implements OnTouchListener,OnGestureListener{private GestureDetector gestureDetector;private View deleteButton;private ViewGroup itemLayout;private onDeleteListener listener;private int selectedItem;private boolean isDeleteShown;private Context lcontext;public void setonDeleteListener(onDeleteListener l){listener = l;}//回調介面public interface onDeleteListener{void onDelete(int index);}public MyListView(Context context, AttributeSet attrs) {super(context, attrs);gestureDetector = new GestureDetector(getContext(), this);lcontext = context;setOnTouchListener(this);}//事件的傳入口,分發事件給gestureDetector。@Overridepublic boolean onTouch(View v, MotionEvent event) {if(isDeleteShown){itemLayout.removeView(deleteButton);deleteButton = null;isDeleteShown = false;return false;}return gestureDetector.onTouchEvent(event);}@Overridepublic boolean onDown(MotionEvent e) {if(!isDeleteShown){//所按下位置的行數selectedItem = pointToPosition((int)e.getX(),(int) e.getY());}return true;}//處理滑動事件@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {//如果按鈕沒有顯示並且在x軸上的速度大於在y軸上的速度if(!isDeleteShown && Math.abs(velocityX) > Math.abs(velocityY)){deleteButton = LayoutInflater.from(getContext()).inflate(R.layout.delete_button, null);deleteButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {itemLayout.removeView(deleteButton);deleteButton = null;isDeleteShown = false;listener.onDelete(selectedItem);}});//(從當前頁面可見的開始)擷取一行的布局itemLayout = (ViewGroup) getChildAt(selectedItem - getFirstVisiblePosition());if(itemLayout == null){Toast.makeText(lcontext, "請選擇可用的行!", Toast.LENGTH_SHORT).show();return false;}//設定button的添加參數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 true;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {// TODO Auto-generated method stubreturn false;}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stub}}
之後定義刪除按鈕布局,和主介面的布局,item布局。

自訂adapter:

package com.example.mylistview;import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.TextView;public class MyAdapter extends ArrayAdapter<String> {public MyAdapter(Context context, int resource, List<String> objects) {super(context, resource, objects);// TODO Auto-generated constructor stub}@Overridepublic View getView(int position,View convertView,ViewGroup parent){View view;if(convertView == null){view = LayoutInflater.from(getContext()).inflate(R.layout.list_view_item, null);}else{view = convertView;}TextView tv = (TextView)view.findViewById(R.id.text_view);tv.setText(getItem(position));return view;}}
主介面代碼:

</pre><pre name="code" class="java">package com.example.mylistview;import java.util.ArrayList;import java.util.List;import com.example.mylistview.MyListView.onDeleteListener;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.Window;import android.app.Activity;public class MainActivity extends Activity {MyListView myList;MyAdapter adapter;private List<String> list = new ArrayList<String>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);initList();myList = (MyListView)findViewById(R.id.myList);//傳入介面,並實現相應的方法myList.setonDeleteListener(new onDeleteListener() {@Override//根據回調傳回來的item索引刪除相應的行public void onDelete(int index) {list.remove(index);adapter.notifyDataSetChanged();}});adapter = new MyAdapter(this, 0, list);myList.setAdapter(adapter);}private void initList() {list.clear();list.add("item 1");list.add("item 2");list.add("item 3");list.add("item 4");list.add("item 5");list.add("item 6");list.add("item 7");list.add("item 8");list.add("item 9");list.add("item 10");list.add("item 11");list.add("item 12");list.add("item 13");list.add("item 14");list.add("item 15");}@Overridepublic boolean onCreateOptionsMenu(Menu menu){getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item){if(item.getItemId() == R.id.reLoad){initList();adapter.notifyDataSetChanged();}return true;}}






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

GOOGLE下SwipeListView
 
android ListView 滑動刪除問題

你可以參考下android4.0源碼中最近任務介面的代碼,具體位置在frameworks\base\packages\SystemUI下
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.