側滑删除进阶(七、八)

activity_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="com.harvic.scrollview_scroller.MainActivity" >

    <com.harvic.scrollview_scroller.MyListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

item_layout.xml

<?xml version="1.0" encoding="utf-8"?

>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lin_root"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minHeight="120dp">

    <TextView
        android:id="@+id/title"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#FF83FA"
        android:gravity="center"
        android:textSize="25dp" />

    <TextView
        android:id="@+id/del"
        android:layout_width="200dp"
        android:layout_height="fill_parent"
        android:background="#EEEEE0"
        android:text="删除"
        android:textSize="25dp"
        android:textColor="#ffffff"
        android:gravity="center" />

</LinearLayout>

MainActivity

package com.harvic.scrollview_scroller;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

import com.harvic.scrollview_scroller.MergeListAdapter.DataHolder;

public class MainActivity extends Activity implements View.OnClickListener {

    private MyListView listView;
    private MergeListAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = (MyListView)findViewById(R.id.listview);
        final List<DataHolder> items = new ArrayList<DataHolder>();
        for(int i=0;i<20;i++){
            DataHolder item = new DataHolder();
            item.title = "第"+i+"项";
            items.add(item);
        }
        adapter = new MergeListAdapter(this,items,this);
        listView.setAdapter(adapter);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.del){
           int position = listView.getPositionForView(v);
           adapter.removeItem(position);
        }
    }

}

MergeListAdapter

package com.harvic.scrollview_scroller;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by enwei.zew on 2015/4/16.
 */
public class MergeListAdapter extends BaseAdapter {
    private Context mContext;
    private LayoutInflater mInflater;
    private List<DataHolder> mDataList = new ArrayList<DataHolder>();
    private View.OnClickListener mDelClickListener;

    public MergeListAdapter(Context context, List<DataHolder> dataList, View.OnClickListener delClickListener) {
        mContext = context;
        mInflater = LayoutInflater.from(context);
        if (dataList != null && dataList.size() > 0) {
            mDataList.addAll(dataList);
        }
        mDelClickListener = delClickListener;
    }

    public void removeItem(int position) {
        mDataList.remove(position);
        notifyDataSetChanged();
    }

    public void addItem(DataHolder item) {
        mDataList.add(item);
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mDataList.size();
    }

    @Override
    public Object getItem(int position) {
        return mDataList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null || convertView.getTag() == null) {
            convertView = mInflater.inflate(R.layout.item_layout, parent, false);
            holder = new ViewHolder();
            holder.title = (TextView) convertView.findViewById(R.id.title);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        DataHolder item = mDataList.get(position);
        holder.title.setText(item.title);

        item.rootView = (LinearLayout) convertView.findViewById(R.id.lin_root);
        item.rootView.scrollTo(0, 0);

        //点击删除实现方法二:交由外部处理:
        TextView delTv = (TextView) convertView.findViewById(R.id.del);
        delTv.setOnClickListener(mDelClickListener);
        return convertView;
    }

    private static class ViewHolder {
        public TextView title;
    }

    public static class DataHolder {
        public String title;
        public LinearLayout rootView;
    }

}

MyListView

package com.harvic.scrollview_scroller;

import com.harvic.scrollview_scroller.MergeListAdapter.DataHolder;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.LinearInterpolator;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Scroller;

public class MyListView extends ListView {
	// 每一个条目的容器控件
	private LinearLayout itemRoot;
	// 上次手指的x轴坐标
	private int mlastX = 0;
	// 删除控件的最大宽度
	private final int MAX_WIDTH = 200;
	private Context mContext;
	// scrollTo()是没有办法加入运动的时间长度的,所以为了弥补这个问题,google就新增了一个类Scroller!

private Scroller mScroller;

	public MyListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
		// 创建具有插值器的构造方法
		mScroller = new Scroller(context, new LinearInterpolator(context, null));
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		int maxLength = dipToPx(mContext, MAX_WIDTH);
		// 获取手势操作触发的xy轴坐标值
		int x = (int) event.getX();
		int y = (int) event.getY();

		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN: {
			// 我们想知道当前点击了哪一行
			int position = pointToPosition(x, y);
			if (position != INVALID_POSITION) {
				// 获取点击的item控件的id值
				DataHolder data = (DataHolder) getItemAtPosition(position);
				itemRoot = data.rootView;
			}
		}
			break;
		case MotionEvent.ACTION_MOVE: {
			// 获取item的容器控件在x轴偏移量
			int scrollX = itemRoot.getScrollX();
			// 实时获取最新的偏移量
			int newScrollX = scrollX + mlastX - x;
			// 假设手势向右边滑动,可能<0
			if (newScrollX < 0) {
				newScrollX = 0;
			} else if (newScrollX > maxLength) {
				newScrollX = maxLength;
			}
			itemRoot.scrollTo(newScrollX, 0);
		}
			break;
		case MotionEvent.ACTION_UP: {
			int scrollX = itemRoot.getScrollX();
			int newScrollX = scrollX + mlastX - x;
			if (scrollX > maxLength / 2) {
				newScrollX = maxLength;
			} else {
				newScrollX = 0;
			}
			// startScroll(int startX, int startY, int dx, int dy)
			/**
			 * startX:開始移动的X坐标 startY開始移动的Y坐标
			 * dx:沿X轴移动距离,可正可负,为正时。子控件向左移动;为负时,子控件向右移动
			 * dy:沿Y轴移动距离,相同,为正时,子控件向上移动;为负时。子控件向下移动 duration:整个移动过程,所耗费时长
			 */
			mScroller.startScroll(scrollX, 0, newScrollX - scrollX, 0);
			invalidate();
		}
			break;
		}

		mlastX = x;
		return super.onTouchEvent(event);
	}

	private int dipToPx(Context context, int dip) {
		return (int) (dip * context.getResources().getDisplayMetrics().density + 0.5f);
	}

	/**
	 * computeScroll()函数。不是Scroller的函数,而是VIEW的函数,
	 * 当调用invaidate或者postInvalidate重绘时就会调用computeScroll() 来重绘与scroller有关的View部分,
	 */
	@Override
	public void computeScroll() {
		if (mScroller.computeScrollOffset()) {
			itemRoot.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
		}
		invalidate();

	}
}

************************************************升级********************************************

activity_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="com.harvic.scrollviewultimate.MainActivity" >

    <com.harvic.scrollviewultimate.MyListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

item_layout.xml

<?xml version="1.0" encoding="utf-8"?

>

<com.harvic.scrollviewultimate.MyLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lin_root"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minHeight="120dp">

    <TextView
        android:id="@+id/title"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#0000ff"
        android:gravity="center"
        android:textSize="25dp" />

    <TextView
        android:id="@+id/del"
        android:layout_width="200dp"
        android:layout_height="fill_parent"
        android:background="#ffff00"
        android:text="删除"
        android:textSize="25dp"
        android:textColor="#ffffff"
        android:gravity="center" />

</com.harvic.scrollviewultimate.MyLinearLayout>

MainActivity

package com.harvic.scrollviewultimate;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

import com.harvic.scrollviewultimate.MergeListAdapter.DataHolder;

public class MainActivity extends Activity implements View.OnClickListener,MyLinearLayout.OnScrollListener{
    private MyListView listView;
    private MergeListAdapter adapter;
    private MyLinearLayout mLastScrollView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = (MyListView)findViewById(R.id.listview);
        final List<DataHolder> items = new ArrayList<DataHolder>();
        for(int i=0;i<20;i++){
            DataHolder item = new DataHolder();
            item.title = "第"+i+"项";
            items.add(item);
        }
        adapter = new MergeListAdapter(this,items,this,this);
        listView.setAdapter(adapter);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.del){
            int position = listView.getPositionForView(v);
            adapter.removeItem(position);
        }
    }

    @Override
    public void OnScroll(MyLinearLayout view) {
        if (mLastScrollView != null){
            mLastScrollView.smoothScrollTo(0,0);
        }
        mLastScrollView = view;
    }
}

MyListView

package com.harvic.scrollviewultimate;

import com.harvic.scrollviewultimate.MergeListAdapter.DataHolder;

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

public class MyListView extends ListView {

    private MyLinearLayout mCurView;
    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                int position = pointToPosition(x, y);
                if (position != INVALID_POSITION) {
                    DataHolder data = (DataHolder) getItemAtPosition(position);
                    mCurView = data.rootView;
                }
            }
            break;
            default:
                break;
        }
        if (mCurView != null){
            mCurView.disPatchTouchEvent(event);
        }
        return super.onTouchEvent(event);
    }
}

MergeListAdapter

package com.harvic.scrollviewultimate;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MergeListAdapter extends BaseAdapter {
    private Context mContext;
    private LayoutInflater mInflater;
    private List<DataHolder> mDataList = new ArrayList<DataHolder>();
    private View.OnClickListener mDelClickListener;
    private MyLinearLayout.OnScrollListener mScrollListener;

    public MergeListAdapter(Context context, List<DataHolder> dataList, View.OnClickListener delClickListener,MyLinearLayout.OnScrollListener listener) {
        mContext = context;
        mInflater = LayoutInflater.from(context);
        if (dataList != null && dataList.size() > 0) {
            mDataList.addAll(dataList);
        }
        mDelClickListener = delClickListener;
        mScrollListener = listener;
    }

    public void removeItem(int position) {
        mDataList.remove(position);
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mDataList.size();
    }

    @Override
    public Object getItem(int position) {
        return mDataList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null || convertView.getTag() == null) {
            convertView = mInflater.inflate(R.layout.item_layout, parent, false);
            holder = new ViewHolder();
            holder.title = (TextView) convertView.findViewById(R.id.title);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        DataHolder item = mDataList.get(position);
        holder.title.setText(item.title);

        item.rootView = (MyLinearLayout) convertView.findViewById(R.id.lin_root);
        item.rootView.scrollTo(0, 0);
        item.rootView.setOnScrollListener(mScrollListener);

        //点击删除实现方法二:交由外部处理:
        TextView delTv = (TextView) convertView.findViewById(R.id.del);
        delTv.setOnClickListener(mDelClickListener);
        return convertView;
    }

    private static class ViewHolder {
        public TextView title;
    }

    public static class DataHolder {
        public String title;
        public MyLinearLayout rootView;
    }

}

MyLinearLayout

package com.harvic.scrollviewultimate;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.animation.LinearInterpolator;
import android.widget.LinearLayout;
import android.widget.Scroller;

/**
 * Created by enwei.zew on 2015/4/28.
 */
public class MyLinearLayout extends LinearLayout {
    private int mlastX = 0;
    private final int MAX_WIDTH = 200;
    private Context mContext;
    private Scroller mScroller;
    private OnScrollListener mScrollListener;

    public static interface OnScrollListener {
        public void OnScroll(MyLinearLayout view);
    }

    public MyLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        mScroller = new Scroller(context, new LinearInterpolator(context, null));
    }

    public void disPatchTouchEvent(MotionEvent event) {
        int maxLength = dipToPx(mContext, MAX_WIDTH);

        int x = (int) event.getX();
        int y = (int) event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: {
            }
            break;
            case MotionEvent.ACTION_MOVE: {
                int scrollX = this.getScrollX();
                int newScrollX = scrollX + mlastX - x;
                if (newScrollX < 0) {
                    newScrollX = 0;
                } else if (newScrollX > maxLength) {
                    newScrollX = maxLength;
                }
                this.scrollTo(newScrollX, 0);
            }
            break;
            case MotionEvent.ACTION_UP: {
                int scrollX = this.getScrollX();
                int newScrollX = scrollX + mlastX - x;
                if (scrollX > maxLength / 2) {
                    newScrollX = maxLength;
                    mScrollListener.OnScroll(this);
                } else {
                    newScrollX = 0;
                }
                mScroller.startScroll(scrollX, 0, newScrollX - scrollX, 0);
                invalidate();

            }
            break;
        }
        mlastX = x;
    }

    public void setOnScrollListener(OnScrollListener scrollListener) {
        mScrollListener = scrollListener;
    }

    public void smoothScrollTo(int destX, int destY) {
        int scrollX = getScrollX();
        int delta = destX - scrollX;
        mScroller.startScroll(scrollX, 0, delta, 0);
        invalidate();
    }

    @Override
    public void computeScroll() {
        if (mScroller.computeScrollOffset()) {
            this.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
        }
        invalidate();
    }

    private int dipToPx(Context context, int dip) {
        return (int) (dip * context.getResources().getDisplayMetrics().density + 0.5f);
    }
}
时间: 2024-10-09 20:00:23

側滑删除进阶(七、八)的相关文章

高仿QQ6.0之側滑删除

前两天已经完毕了高仿QQ6.0側滑和优化,今天来看下側滑删除的实现吧,假设有兴趣,能够去看下之前的两篇,仿QQ6.0側滑之ViewDragHelper的使用(一)和高仿QQ6.0側滑菜单之滑动优化(二),好了不多说,開始今天的内容了. 假设看过之前的两篇的话,想必今天的非常好实现的.我们来分析一下哈,側滑删除,布局也就是前面一个item.然后有两个隐藏的button(TextView也能够),然后我们能够向左側滑动,然后显示出来,然后对delete(删除键)实现监听.就能够了哈.好了那就来看看代

Android学习之仿QQ側滑功能的实现

如今项目越来越多的应用了滑动删除的功能,Android本来遵循的是长按删除,IOS定制的是滑动删除,不可否认滑动删除确实在客户体验上要好一点,所以看了非常多关于仿QQ滑动删除的样例,还是感觉代码家的Android Swipe Layout要好一点,至于为何好,以下我给大家实验一下大家就知道了 老规矩.贴上效果图.这样大家才干更近距离的了解 这是代码家的效果图,效果非常多,支持listview.gridview,当然recylerview也是支持的. 可是呢,有个问题,代码家的效果非常多.可是我们

7. 蛤蟆的数据结构进阶七平衡二叉树

7. 蛤蟆的数据结构进阶七平衡二叉树 本地名言:"金钱的贪求(这个毛病,目前我们大家都犯得很凶)和享乐的贪求,促使我们成为它们的奴隶,也可以说,把我们整个身心投入深渊.唯利是图,是一种痼疾,使人卑鄙,但贪求享乐,更是一种使人极端无耻,不可救药的毛病. --郎加纳斯" 我们来看下传说中的平衡二叉树,为什么说他传说中呢?因为蛤蟆接触ORACLE数据库比较多,而ORACLE数据中用到最多的索引就是平衡二叉树,所以嘛. 欢迎转载,转载请标明出处:http://write.blog.csdn.n

【译】SQL Server索引进阶第八篇:唯一索引

原文:[译]SQL Server索引进阶第八篇:唯一索引     索引设计是数据库设计中比较重要的一个环节,对数据库的性能其中至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就获取到的,很多的技术人员因为不恰当的创建索引,最后使得其效果适得其反,可以说"成也索引,败也索引".     本系列文章来自Stairway to SQL Server Indexes,翻译和整理后发布在agilesharp和博客园,希望对广大的技术朋友在如何使用索引上有所帮助.   唯一

20182304 《数据结构与面向对象程序设计》第七八周学习总结

20182304 <数据结构与面向对象程序设计>第七八周学习总结 教材学习内容总结 时间复杂度分析:时间复杂度越低,程序运行效率越高.时间复杂度又称为算法的阶,符号计为O(),它由增长函数的主项决定.可以通过数学方法求出增长函数从而确定程序的时间复杂度 线性集合:集合中的元素按直线方式组织.如:队列集合.栈集合 栈是一种线性数据结构,采用后进先出(Last in,first out)的方法处理元素,我们学习使用了数组和链表来实现栈 链表:链表是链式结构的一种.在链表中,对象引用变量也可称为指针

类似于QQ的右滑删除效果的实现方法

类似于QQ的右滑删除效果的实现方法 原理:删除的div在窗口的外面,用户看不到,用户右滑,显示次div ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 6

android:QQ多种側滑菜单的实现

在这篇文章中写了 自己定义HorizontalScrollView实现qq側滑菜单 然而这个菜单效果仅仅是普通的側拉效果 我们还能够实现抽屉式側滑菜单 就像这样 第一种效果 另外一种效果 第三种效果 第四种效果 其他代码都和上篇文章同样,仅仅是在MyHorizontalScrollView.class重写onScrollChanged这种方法 第一种的側滑效果代码非常easy @Override protected void onScrollChanged(int l, int t, int o

qq联系人 左滑删除功能

// 局部刷新 NSArray *indexPaths = @[ [NSIndexPath indexPathForRow:0 inSection:0], [NSIndexPath indexPathForRow:1 inSection:0] ]; [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationLeft]; #pragma mark - 按钮的点击 - (IBAc

ANDROID仿IOS微信滑动删除_SWIPELISTVIEW左滑删除例子

http://dwtedx.sinaapp.com/itshare_290.html 本例子实现了滑动删除ListView的Itemdemo的效果.大家都知道.这种创意是来源于IOS的.左滑删除的功能.在Android上面实现比较麻烦.本例子中不仅实现了左滑删除功能.还实现了左滑赞.左滑分享.左滑收藏等功能.当然大家也可以根据自己项目的需求来修改功能.QQ和微信也实现了相同的功能.大家可以看看.先上程序运行的效果 怎么样.大家看了这个截图是不是很心动呀.而且在左滑的时候还配有简单的滑动动画呢.非