用ListView+自定义的HorizontalScrollView实现滑动删除效果

先给出效果图,但是不会弄动画。。。所以给出了三张图

用ListView+自定义的HorizontalScrollView实现滑动删除效果_第1张图片用ListView+自定义的HorizontalScrollView实现滑动删除效果_第2张图片用ListView+自定义的HorizontalScrollView实现滑动删除效果_第3张图片

效果就这样,滑动非常流畅,ok首先来讲讲原理,ListView+HorizontalScrollView的组合,listView中的美个item的内容就是HorizontalScrollView,注意我这里使用的自定义HorizontalScrollView,具体效果小伙伴们跑起来就知道了害羞


首先写好布局文件,一共4个,主布局main_activity.xml,  listview的布局文件 list_item.xml ,  还有left.xml、right.xmlfe分别是上图中的白色部分和红色部分

main_activity.xml

<LinearLayout 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"
	android:orientation="vertical">

    <ListView
        android:id="@+id/id_lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

    
</LinearLayout>


list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:orientation="vertical">
    
    <!-- HorizontalScrollView里面的view在宽度上设置match没有效果 -->
    <com.ex.listviewdelitem.view.MyHorizontalScrollView
        android:id="@+id/id_hsv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="none">
        
        <LinearLayout
            android:layout_width="360dp"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            android:gravity="center_vertical">
            
            <include layout="@layout/left"/>
			<include layout="@layout/right" />
            
        </LinearLayout>
        
    </com.ex.listviewdelitem.view.MyHorizontalScrollView>

</LinearLayout>

left.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:gravity="center_vertical"
    >
    
    <TextView
        android:id="@+id/id_tv_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:layout_marginLeft="60dp"/>
    

</LinearLayout>

right.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_vertical"
    android:background="#FF2D2D">
    
    <Button
        android:id="@+id/id_tv_2"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:text="删除"
        android:textSize="15dp"
        android:textColor="#000000"
        android:layout_marginLeft="50dp"
        android:background="@drawable/bt_bg"/>

</LinearLayout>


第二部,自定义我们的MyHorizontalScrollView

/**
 * @author solo
 *	自定义水平滑动view分三步:
 *	1、初始化各个子View,注意不能再构造方法中执行,否则返回的结果都是null
 *	2、设置其中每个子View的宽和高
 *	3、在onlayout中设置HorizontalScrollView的初始位置
 *	4、在onTouchEvent中设置滑动时的触发事件
 */
public class MyHorizontalScrollView extends HorizontalScrollView {

	private ViewGroup mLeftView;
	private ViewGroup mRightView;
	private ViewGroup mWapper;
	
	private int mScreenWidth;
	private int mRightViewWidth;
	
	private boolean once;
	
	
	public MyHorizontalScrollView(Context context) {
		this(context,null);
	}
	
	public MyHorizontalScrollView(Context context, AttributeSet attrs,
			int defStyleAttr) {
		super(context, attrs, defStyleAttr);
	}

	public MyHorizontalScrollView(Context context, AttributeSet attrs) {
		this(context, attrs,0);
		
		
		DisplayMetrics dm = new DisplayMetrics();
		WindowManager wm=(WindowManager) context.getSystemService(context.WINDOW_SERVICE);
		wm.getDefaultDisplay().getMetrics(dm);
		mScreenWidth=dm.widthPixels;
		
	}
	
	
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		Log.i("TAG", 1111111+"");
		//设置各个view的宽高
		if(!once){
			mWapper=(ViewGroup) getChildAt(0);
			mLeftView=(ViewGroup) mWapper.getChildAt(0);
			mRightView=(ViewGroup) mWapper.getChildAt(1);
			
			mLeftView.getLayoutParams().width=mScreenWidth;
			mRightView.getLayoutParams().width=mScreenWidth/3;
		
			mRightViewWidth=mScreenWidth/3;
		}
	}
	
	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		Log.i("TAG", changed+"");
		super.onLayout(changed, l, t, r, b);
			scrollTo(0, 0);
		
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		int action = event.getAction();
		int x=getScrollX();
		switch (action) {
			case MotionEvent.ACTION_UP:{
				if(x<mRightViewWidth/2){
					smoothScrollTo(0, 0);
				}else {
					smoothScrollTo(mRightViewWidth, 0);
				}
			}return true;
		}
		return super.onTouchEvent(event);
	}
}

给ListView自定义一个Adapter

package com.ex.listviewdelitem;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MyAdapter extends ArrayAdapter<String> {

	LayoutInflater mInflater;
	Context mContext;
	List<String> mDatas;
	
	public MyAdapter(Context context,List<String> datas){
		super(context, 0,datas);
		mContext=context;
		mDatas=datas;
		mInflater=LayoutInflater.from(context);
	}
	
	private class ViewHloder{
		TextView text;
		Button bt;
	}
	
	@Override
	public View getView(final int position, View convertView, ViewGroup parent) {
		ViewHloder holder;
		if (convertView==null) {
			convertView=mInflater.inflate(R.layout.list_item, parent, false);
			holder=new ViewHloder();
			holder.text=(TextView) convertView.findViewById(R.id.id_tv_1);
			holder.bt=(Button) convertView.findViewById(R.id.id_tv_2);
			convertView.setTag(holder);
		}else {
			holder=(ViewHloder) convertView.getTag();
		}
		
		holder.text.setText(mDatas.get(position));
		holder.bt.setText("删除");
		
		convertView.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				
				
			}
		});
		
		
		holder.bt.setOnClickListener(new OnClickListener() {
			
		//把item上buton的点击事件放到这里就行了,不能直接放到mainActivity
			@Override
			public void onClick(View v) {
				remove(mDatas.get(position));
			}
		});
		
		
		return convertView;
	}
}

最后在Main_Activity中进行最后的工作

package com.ex.listviewdelitem;

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

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {

	private ListView mListView;
	private List<String> mDatas;
	private MyAdapter mAdapter;
	Button mButton;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		initView();
		initDatas();
		
		mAdapter=new MyAdapter(this, mDatas);
		mListView.setAdapter(mAdapter);
		
		
	}
	
	
	

	private void initView() {
		mListView=(ListView) findViewById(R.id.id_lv);
		mButton=(Button) findViewById(R.id.id_tv_2);
		mDatas=new ArrayList<String>();
	}
	
	private void initDatas(){
		mDatas.add("北京天气晴朗");
		mDatas.add("上海多云小雨");
		mDatas.add("杭州风和日丽");
		mDatas.add("广州狂风暴雨");
		mDatas.add("深圳狂风暴雨");
	}

}

最后我这里有一个问题,ListView的本身不能点击了,不过我的删除按钮还是能点击的,滑动删除效果没有影响,有哪位大神研究出怎么使ListView也能点击求告知

你可能感兴趣的:(ListView,滑动删除)