listview获得每一项的点击,长按,滑动事件

本文介绍如何在ListView中集成触摸滑动、点击及长按事件,通过自定义View和适配器实现复杂的交互逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一(好方法)

public class TestListView extends ListView
{
    float downX;
    float downY;
    float upX;
    float upY;
    private static final String TAG = "TestListView - gc";
    boolean isGesture = false;
    Context mContext;
    public TestListView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        mContext = context;
    }

    public TestListView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        mContext = context;
    }

    public TestListView(Context context)
    {
        super(context);
        mContext = context;
    }
    
    @Override
    public boolean performItemClick(View view, int position, long id) {
        if(isGesture){
            Log.d(TAG," ---------- performItemClick false"  );
            return true;
        }else{
            Log.d(TAG," ---------- performItemClick "  );
            return super.performItemClick(view, position, id);
        }
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent ev)
    {   
        if (ev.getAction() == MotionEvent.ACTION_DOWN)
        {
            isGesture = false;
            downX = ev.getX();
            downY = ev.getY();
        }
        if (ev.getAction() == MotionEvent.ACTION_UP)
        {
            upX = ev.getX();
            upY = ev.getY();
            int p1 = pointToPosition((int) downX, (int) downY);//获得position
            int p2 = pointToPosition((int) upX, (int) upY);
            if (p1 == p2 && Math.abs(downX - upX) > (getWidth()/10))
            {
                //进行滑动操作
                Toast.makeText(mContext, "listview position : " + p1 + " p2 = " + p2, Toast.LENGTH_SHORT)
                        .show();
                isGesture = true;
            }
        }
        return super.onTouchEvent(ev);
    }

}


方法二(不推荐)

重写每项的view

public class ItemView extends LinearLayout
{
    private static final String TAG = "ItemView - gc";
    GestureDetector gestureDetector;
    int minVelocity = 500;
    Context mContext;
    boolean isGesture = false;
    boolean isLongClick = false;
    OnMyGestureListener onMyGestureListener;
    public ItemView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        init(context);
    }


    public ItemView(Context context)
    {
        super(context);
        init(context);
    }
    public void init(Context context)
    {
        mContext = context;
        setClickable(true);
        setLongClickable(true);
        gestureDetector = new GestureDetector(new GestureDetector.OnGestureListener()
        {
            
            @Override
            public boolean onSingleTapUp(MotionEvent e)
            {
                Log.d(TAG, "onSingleTapUp");
                return false;
            }
            
            @Override
            public void onShowPress(MotionEvent e)
            {
                Log.d(TAG, "onShowPress");
            }
            
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
            {
                Log.d(TAG, "onScroll distanceX : " + distanceX + " e2 -e1 = " + (e2.getX() - e1.getX()));
                if (e2.getX() - e1.getX() > (getWidth() / 10) )//滑动多长距离才算滑动事件
                {
                    if((!isGesture)&&(!isLongClick))
                    {
                        isGesture = true;
                        if(onMyGestureListener != null)
                        {
                            onMyGestureListener.onGesture(ItemView.this);
                        }
                    }
                    return true;
                } 
                return false;
            }
            
            @Override
            public void onLongPress(MotionEvent e)
            {
                Log.d(TAG, "onLongPress");
            }
            
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
            {
//                Log.d(TAG, "onFling"+ " e2 -e1 = " + (e2.getX() - e1.getX()));
//                if (e2.getX() - e1.getX() > (getWidth() / 5) && Math.abs(velocityX) > minVelocity)
//                {
//                    Log.d(TAG, " ---------- Gesture " + title.getText());
//                    Toast.makeText(mContext, "Gesture : " + title.getText(), Toast.LENGTH_SHORT).show();
//                    isGesture = true;
//                    // new AlertDialog.Builder(mContext).setTitle("next").show();
//                    return true;
//                } 
                return false;
            }
            
            @Override
            public boolean onDown(MotionEvent e)
            {
                Log.d(TAG, "onDown");
                isLongClick = false;
                isGesture = false;
                return false;
            }
        });
        gestureDetector.setIsLongpressEnabled(true);
    }
    
    @Override//是否执行点击事件
    public boolean performClick() {
        if(isGesture||isLongClick){
            return true;
        }else{
            return super.performClick();
        }
    }
    
    @Override//是否执行长按事件
    public boolean performLongClick()
    {
        isLongClick = true;
        if(isGesture)
        {
            return true;
        }
        return super.performLongClick();
    }
     
    @Override
    public boolean onTouchEvent(MotionEvent ev)
    {   
        gestureDetector.onTouchEvent(ev);//启动滑动监听
        return super.onTouchEvent(ev);
    }
    

//给上层调用滑动监听
    public void setOnGestureListener(OnMyGestureListener onMyGestureListener)
    {
        this.onMyGestureListener = onMyGestureListener;
    }
    
    interface OnMyGestureListener{
        public void onGesture(View v);
    }
    
}


在adapter中加入监听事件


public class TestAdapter extends BaseAdapter
{
    public static final String TAG = "TestAdapter--gc";
    
    ArrayList<Map<String, String>> array;
    Context mContext;
    OnClickListener onClickListener;
    OnLongClickListener onLongClickListener;
    OnMyGestureListener onMyGestureListener;
    public TestAdapter(Context context, ArrayList<Map<String, String>> array)
    {
        this.array = array;
        this.mContext = context;
        onClickListener = new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                String text = (String) ((TextView)v.findViewById(R.id.textView1)).getText();
                String tmp = (String) ((TextView)v.findViewById(R.id.textView2)).getText();
                int position = Integer.valueOf(tmp.substring(tmp.lastIndexOf(":")+1));
                Log.d(TAG,"onClick---position = " + position +"  text : "+text);
                Toast.makeText(mContext, "onClick---position = " + position +"  text : "+text, Toast.LENGTH_SHORT).show();

                array.remove(position);//删除这一项,用来测试position
                notifyDataSetChanged();
            }
        };
        onLongClickListener = new OnLongClickListener()
        {
            @Override
            public boolean onLongClick(View v)
            {
                String text = (String) ((TextView)v.findViewById(R.id.textView1)).getText();
                String tmp = (String) ((TextView)v.findViewById(R.id.textView2)).getText();
                int position = Integer.valueOf(tmp.substring(tmp.lastIndexOf(":")+1));
                Log.d(TAG,"onLongClick---position = " + position +"  text : "+text);
                Toast.makeText(mContext, "onLongClick---position = " + position +"  text : "+text, Toast.LENGTH_SHORT).show();
                return false;
            }
        };
        onMyGestureListener = new OnMyGestureListener()
        {
            @Override
            public void onGesture(View v)
            {
                String text = (String) ((TextView)v.findViewById(R.id.textView1)).getText();
                String tmp = (String) ((TextView)v.findViewById(R.id.textView2)).getText();
                int position = Integer.valueOf(tmp.substring(tmp.lastIndexOf(":")+1));
                Log.d(TAG,"onGesture---position = " + position +"  text : "+text);
                Toast.makeText(mContext, "onGesture---position = " + position +"  text : "+text, Toast.LENGTH_SHORT).show();
            }
        };
    }
    @Override
    public int getCount()
    {
        return array.size();
    }


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


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


    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        Holder holder;
        if(convertView == null)
        {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item, null);
            holder = new Holder();
            holder.textView1 = (TextView) convertView.findViewById(R.id.textView1);
            holder.textView2 = (TextView) convertView.findViewById(R.id.textView2);
            
            convertView.setOnClickListener(onClickListener);//设置点击事件
            convertView.setOnLongClickListener(onLongClickListener);//设置长按事件
            ((ItemView)convertView).setOnGestureListener(onMyGestureListener);//设置滑动事件
            
            convertView.setTag(holder);
        }else{
            holder = (Holder) convertView.getTag();
        }
        holder.textView1.setText(array.get(position).get("title"));
        holder.textView2.setText("position :" + position);//可以隐藏不显示
        
        return convertView;
    }


    class Holder{
        TextView textView1;
        TextView textView2;
    }
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值