自定义View之可删除item的ListView

MainActivity如下:

package com.francis.deletablelistview;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.SimpleAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MainActivity extends Activity {
    private MyListView myListView;
    private SimpleAdapter mSimpleAdapter;
    private ArrayList mArrayList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initList();
    }

    private void initList() {
        myListView = (MyListView) findViewById(R.id.my_list_view);

        mArrayList = new ArrayList<HashMap<String,String>>();
        HashMap<String,String> hashMap = null;
        for (int i = 0; i < 10; i++) {
            hashMap=new HashMap<String, String>();
            hashMap.put("name","Francis"+i);
            mArrayList.add(hashMap);
        }
        mSimpleAdapter = new SimpleAdapter(this,mArrayList,R.layout.my_list_view_item,new String[]{"name"},new int[]{R.id.text_view});
        myListView.setAdapter(mSimpleAdapter);
        myListView.setOnDeleteListener(new MyListView.OnDeleteListener() {
            @Override
            public void onDelete(int index) {
                mArrayList.remove(index);
                mSimpleAdapter.notifyDataSetChanged();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

MyListView 如下:

package com.francis.deletablelistview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.RelativeLayout;

/**
 * Created by Francis on 14-9-23.
 */
public class MyListView extends ListView implements View.OnTouchListener,GestureDetector.OnGestureListener {
    private GestureDetector mGestureDetector;
    private Boolean isDeleteShown = false;
    private ViewGroup itemLayout;
    private View deleteButton;
    private int selecetedItem;
    private OnDeleteListener mOnDeleteListener;

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // 创建GestureDetector实例用于监听手势
        mGestureDetector = new GestureDetector(getContext(),this);
        // 给MyListView注册touch监听事件
        setOnTouchListener(this);
    }
    public void setOnDeleteListener(OnDeleteListener onDeleteListener) {
        mOnDeleteListener = onDeleteListener;
    }
    //定义一个接口
    public interface  OnDeleteListener {
        void onDelete(int index);
    }

    //------>以下方法为OnGestureListener接口的实现
    // 轻触触摸屏,由MotionEvent ACTION_DOWN触发
    @Override
    public boolean onDown(MotionEvent e) {
        if (!isDeleteShown) {
            // return The position of the item which contains the specified point
            selecetedItem = pointToPosition((int)e.getX(),(int)e.getY());
        }
        return false;
    }
    // 按住或者拖动的状态(和onDown的区别),由MotionEvent ACTION_DOWN触发
    @Override
    public void onShowPress(MotionEvent e) {

    }
    // 触摸后松开,由MotionEvent ACTION_UP触发
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }
    // 按下触摸屏、并拖动,由一个ACTION_DOWN、多个ACTION_MOVE触发
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        return false;
    }
    //长按触摸屏,由多个ACION_DOWN触发
    @Override
    public void onLongPress(MotionEvent e) {

    }
    // 按下触摸屏、快速移动后松开,由一个ACTION_DOWN、多个ACTION_MOVE、一个ACTION_UP触发
    // e1: 第一个ACTION_DOWN MotionEvent 并且只有一个
    // e2: 最后一个ACTION_MOVE MotionEvent
    // volocityX: X轴上的移动速度
    // volocityY: Y轴上的移动速度
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if (!isDeleteShown && Math.abs(velocityX) > Math.abs(velocityY)) {
            deleteButton = LayoutInflater.from(getContext()).inflate(R.layout.delete_button,null);
            // 回调MainActivty中的onDelete
            deleteButton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    itemLayout.removeView(deleteButton);
                    deleteButton = null;
                    isDeleteShown = false;
                    mOnDeleteListener.onDelete(selecetedItem);
                }
            });
            // 在选择的item上添加deleteButton
            itemLayout = (ViewGroup) getChildAt(selecetedItem - 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);
            isDeleteShown = true;
        }
        return false;
    }
    //------>以下方法为OnTouchListener接口的实现
    // onTouch作为中转站,触发OnGestureListener的callback
    // 如果删除按钮已经显示,就将它移除掉。
    // 如果删除按钮没有显示,使用GestureDetector来处理当前手势。
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (isDeleteShown) {
            itemLayout.removeView(deleteButton);
            deleteButton = null;
            isDeleteShown = false;
            return false;
        } else {
            return mGestureDetector.onTouchEvent(event);
        }
    }

}

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"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <com.francis.deletablelistview.MyListView
        android:id="@+id/my_list_view"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

    </com.francis.deletablelistview.MyListView>
</RelativeLayout>

my_list_view_item如下:

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/text_view"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

delete_button如下:

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

<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/delete_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/delete_button">

</Button>
时间: 2024-10-05 04:39:06

自定义View之可删除item的ListView的相关文章

Android 自定义Adapter实现多视图Item的ListView

自定义Adapter实现多视图Item的ListView http://www.devdiv.com/adapter_item_listview-blog-20-7539.html Android 自定义Adapter实现多视图Item的ListView,布布扣,bubuko.com

自定义滑动删除item的ListView。

首先继承创建继承ListView和实现OnTouchListener,OnGestureListener的类. 会使用到AbsList中的pointToPosition(int x, int y)方法,这个方法主要是根据点击的位置获取点击行的在列表中的索引. 还有ViewGroup中的getChildAt(int index)方法,主要用于根据当前的索引获取子控件.这个(这个索引以可见屏幕顶端开始). 之所以实现OnTouchListener,OnGestureListener.是因为OnGes

自己定义滑动删除item的ListView。

首先继承创建继承ListView和实现OnTouchListener,OnGestureListener的类. 会使用到AbsList中的pointToPosition(int x, int y)方法.这种方法主要是依据点击的位置获取点击行的在列表中的索引. 还有ViewGroup中的getChildAt(int index)方法,主要用于依据当前的索引获取子控件.这个(这个索引以可见屏幕顶端開始). 之所以实现OnTouchListener,OnGestureListener.是由于OnGes

Android自定义view 滑动开关 支持左右滑动 适用于listview

要做这样一种开关. 当开关在左边时,都是灰色的,向右滑动的时候,滑到一半的时候,改变颜色,变成绿色: 当开关在右边是,都市绿色的,向左滑动的时候,滑动一半的时候,改变颜色,变成灰色. 这里就要涉及要可滑动最大距离,以及你现在滑动的距离.通过这个来比较,改变颜色. import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.

【转】Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

原文网址:http://blog.csdn.net/xiaanming/article/details/17539199 我在上一篇文章中Android 带你从源码的角度解析Scroller的滚动实现原理从源码的角度介绍了Scroller的滚动实现原理,相信大家对Scroller的使用有一定的了解,这篇文章就给大家带来使用Scroller的小例子,来帮助大家更加熟悉的掌握Scroller的使用,掌握好了Scroller的使用我们就能实现很多滑动的效果.例如侧滑菜单,launcher,ListVi

本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877)Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

今天还是给大家带来自定义控件的编写,自定义一个ListView的左右滑动删除Item的效果,这个效果之前已经实现过了,有兴趣的可以看下Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果,之前使用的是滑动类Scroller来实现的,但是看了下通知栏的左右滑动删除效果,确实很棒,当我们滑动Item超过一半的时候,item的透明度就变成了0,我们就知道抬起手指的时候item就被删除了,当item的透明度不为0的时候,我们抬起手指Item会回到起始位置,这样我们就知道

Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

今天还是给大家带来自定义控件的编写,自定义一个ListView的左右滑动删除Item的效果,这个效果之前已经实现过了,有兴趣的可以看下Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果, 之前使用的是滑动类Scroller来实现的,但是看了下通知栏的左右滑动删除效果,确实很棒,当我们滑动Item超过一半的时候,item的透明度就变 成了0,我们就知道抬起手指的时候item就被删除了,当item的透明度不为0的时候,我们抬起手指Item会回到起始位置,这样我们就

[转]Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

我在上一篇文章中Android 带你从源码的角度解析Scroller的滚动实现原理从源码的角度介绍了Scroller的滚动实现原理,相信大家对Scroller的使用有一定的了解,这篇文章就给大家带来使用Scroller的小例子,来帮助大家更加熟悉的掌握Scroller的使用,掌握好了Scroller的使用我们就能实现很多滑动的效果.例如侧滑菜单,launcher,ListView的下拉刷新等等效果,我今天实现的是ListView的item的左右滑动删除item的效果,现在很多朋友看到这个效果应该

ListView 实现带有Filpper效果的左右滑动删除 Item

ListView 实现带有Filpper效果的左右滑动删除 Item  的实现最主要的方法还是 对 Listview 的继承重写 .然后是在删除过程中添加 TranslateAnimation 滑动事件. <span style="font-size:14px;">public class FilpperActivity extends Activity { private FilpperListvew flipperListView; private MyAdapter