安卓侧滑删除功能

1.布局文件
<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none" >


    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >


        <TextView
            android:id="@+id/tv_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="1323" />


        <Button
            android:id="@+id/bt_del"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>


</HorizontalScrollView>
-------------------------------------------------------------------------------------
<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="${relativePackage}.${activityClass}" >

    <com.example.scroll.myListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </com.example.scroll.myListView>

</RelativeLayout>

2.代码

a

package com.example.scroll;


import java.util.ArrayList;


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;


public class MainActivity extends Activity {
	private ArrayList<String> al = new ArrayList<String>();
	private myListView lv;


	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initUI();
		initData();
		myAdapter myadapter = new myAdapter(getApplicationContext(), al);
		lv.setAdapter(myadapter);
	}


	/**
	 * 初始化显示数据
	 */
	private void initData() {


		al.add("23r1");
		al.add("2r13");
		al.add("ewf");
		al.add("asv");
		al.add("sav");
		al.add("xzc ");
		al.add("qwf");
		al.add("3rg");
		al.add("ve");
		al.add("dsa");
		al.add("vf");
		al.add("gbr");
		al.add("wv");


	}


	/**
	 * 初始化控件
	 */
	private void initUI() {
		lv = (myListView) findViewById(R.id.lv);
	}


}


b

package com.example.scroll;

import java.util.ArrayList;

import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class myAdapter extends BaseAdapter {
	private Context mc;
	private int width;
	public HorizontalScrollView mView;
	public boolean lockView = false;
	private ArrayList<String> al = new ArrayList<String>();

	public myAdapter(Context mc, ArrayList<String> al) {
		//得到屏幕宽度
		WindowManager wm = (WindowManager) mc
				.getSystemService(mc.WINDOW_SERVICE);
		width = wm.getDefaultDisplay().getWidth();
		
		this.mc = mc;
		this.al = al;
	}

	private class myTouchListener implements OnTouchListener {

		private int startX;
		private int startY;

		@Override
		public boolean onTouch(View v, MotionEvent event) {
			switch (event.getAction()) {
			case MotionEvent.ACTION_UP:
				// 为了平移方便,把view强转
				final HorizontalScrollView view = (HorizontalScrollView) v;
				// 抬手位置
				int endX = (int) event.getX();
				int endY = (int) event.getY();

				// 如果向左划
				if (Math.abs(startY - endY) < 100 && startX - endX > 50) {
					// 1.view设置移动效果
					scrollTo(view, HorizontalScrollView.FOCUS_RIGHT);
					mView = view;
					Log.d("移动", "左移");
				} else {
					scrollTo(view, HorizontalScrollView.FOCUS_LEFT);
				}

				break;
			case MotionEvent.ACTION_DOWN:
				//如果手指按下并且有的侧滑没关闭,就关闭
				if (mView != null) {
					scrollTo(mView, HorizontalScrollView.FOCUS_LEFT);
					lockView = true;
					mView = null;
					return true;
				}
				// 手指按下后就会记录位置
				startX = (int) event.getX();
				startY = (int) event.getY();
				break;
			case MotionEvent.ACTION_MOVE:

				break;

			default:
				break;
			}
			return false;
		}

		

	}
	public void scrollTo(final HorizontalScrollView view, final int way) {
		view.post(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				// 2.使用HorizontalScrollView特有函数进行平移一个页面,把button隐藏
				view.pageScroll(way);

			}
		});
	}
	private class viewHolder {
		public TextView tv;
		public Button bt;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		if (convertView == null) {
			viewHolder vh = new viewHolder();
			convertView = (HorizontalScrollView) View.inflate(mc,
					R.layout.horizontalscrollview, null);
			// 设置滑动事件,设置后就能滑动了
			convertView.setOnTouchListener(new myTouchListener());
			vh.tv = (TextView) convertView.findViewById(R.id.tv_text);

			// 设置textview的宽度,把button挤出屏幕
			vh.tv.setLayoutParams(new LinearLayout.LayoutParams(width,
					LinearLayout.LayoutParams.MATCH_PARENT));

			// 常规操作
			vh.bt = (Button) convertView.findViewById(R.id.bt_del);
			vh.bt.setText("删除");

			convertView.setTag(vh);
		}

		// 常规操作
		viewHolder vh = (viewHolder) convertView.getTag();
		String str = al.get(position);
		vh.tv.setText(str);
		return convertView;
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return al.get(position);
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return al.size();
	}

}

c

package com.example.scroll;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.HorizontalScrollView;
import android.widget.ListAdapter;
import android.widget.ListView;

public class myListView extends ListView {

	private myAdapter md;

	public myListView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	/*
	 * 拦截手指触摸
	 */
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		if (md.lockView) {
			if (ev.getAction() == MotionEvent.ACTION_DOWN
					|| ev.getAction() == MotionEvent.ACTION_MOVE) {
				// 让滑动出删除按钮的那个itemView退回去
				if (md.mView != null) {
					md.scrollTo(md.mView, HorizontalScrollView.FOCUS_LEFT);
					md.mView = null;
				}
				return true;
			}
			if (ev.getAction() == MotionEvent.ACTION_UP) {
				md.lockView = false;
			}
		}
		return super.dispatchTouchEvent(ev);
	}

	@Override
	public void setAdapter(ListAdapter adapter) {
		md = (myAdapter) adapter;
		super.setAdapter(adapter);
	}

}


1.要想实现侧滑,就要把需要滑动的控件用HorizontalScrollView包裹起来,再设置android:scrollbars="none",不让控件有滑动条

猜你喜欢

转载自blog.csdn.net/sinat_40387150/article/details/80909097