You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义ListView Adapter:实现行按压变绿、释放恢复白色

我来帮你搞定这个问题!你现在的代码只处理了按钮的点击事件,这没法实现「按压期间保持绿色、释放恢复白色」的交互——因为点击事件只在松开后触发一次,而我们需要监听触摸的整个过程(按下、松开、取消)。下面是适配你现有代码的解决方案:

解决ListView列表行按压变色的问题

方案一:通过触摸监听代码实现

直接在Adapter的GetView方法里给列表行添加触摸状态监听,精准控制按压和释放时的背景色:

public override View GetView(int position, View convertView, ViewGroup parent)
{
    DataViewHolder holder = null;
    Button ExtraBtn;

    if (convertView == null)
    {
        convertView = LayoutInflater.From(mContext).Inflate(Resource.Layout.InventoryPreview, null, false);
        holder = new DataViewHolder();
        ExtraBtn = convertView.FindViewById<Button>(Resource.Id.ExtrasBtn);
        
        // 给整个列表行绑定触摸监听器
        convertView.SetOnTouchListener(new RowTouchStateListener());
        
        // 保留你原本的按钮点击逻辑(如果需要的话)
        ExtraBtn.Click += (sender, e) => {
            // 这里放按钮点击的原有操作
        };
        
        convertView.Tag = holder;
    }
    else
    {
        holder = convertView.Tag as DataViewHolder;
        ExtraBtn = convertView.FindViewById<Button>(Resource.Id.ExtrasBtn);
    }

    // 这里绑定你的数据到holder控件...

    return convertView;
}

// 自定义触摸状态监听器类
private class RowTouchStateListener : Java.Lang.Object, View.IOnTouchListener
{
    public bool OnTouch(View v, MotionEvent e)
    {
        switch (e.Action)
        {
            case MotionEventActions.Down:
                // 手指按压瞬间,设置背景为绿色
                v.SetBackgroundColor(Color.Green);
                break;
            case MotionEventActions.Up:
            case MotionEventActions.Cancel:
                // 手指松开/触摸被中断(比如滑动离开),恢复白色背景
                v.SetBackgroundColor(Color.White);
                break;
        }
        // 返回false,不拦截ListView滑动、按钮点击等其他交互
        return false;
    }
}

方案二:用Android状态选择器(更推荐)

这是Android官方推荐的方式,完全不需要写代码,通过XML配置就能实现状态切换,更易维护:

  1. 在Resources/drawable目录下新建row_press_selector.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 按压状态下的背景 -->
    <item android:state_pressed="true" android:drawable="@color/green" />
    <!-- 默认状态的背景 -->
    <item android:drawable="@color/white" />
</selector>
  1. 打开你的列表行布局InventoryPreview.axml,给根布局设置这个背景:
<!-- 假设根布局是LinearLayout -->
<LinearLayout
    ...
    android:background="@drawable/row_press_selector">
    
    <!-- 你的其他控件(比如ExtrasBtn) -->
</LinearLayout>

这样系统会自动识别行的按压状态,自动切换背景色,完全不需要在Adapter里写逻辑~

内容的提问来源于stack exchange,提问作者testsc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:05:30