Android:使用 onClick 更改 ListView 行中的按钮背景

2024-02-27

我的行包含一个按钮,该按钮在我的适配器的 getView 中设置了自己的单击侦听器。我可以使用行父级中的 android:descendantFocusability="blocksDescendants" 来区分按钮点击和实际行项目点击。

当我单击按钮时,它会正确设置按钮背景,我的问题是当我滚动列表时,它也会将其设置为不同的行。我认为他们在视图回收方面存在问题。

这是我的代码:

@Override
public View getView(int position, View convertView, ViewGroup parent){

    if(convertView == null){

        holder = new ViewHolder();

        convertView = inflater.inflate(R.layout.todays_sales_favorite_row, null);
        holder.favCatBtn = (Button)convertView.findViewById(R.id.favCatBtn);            

        convertView.setTag(holder);

    } else {
        holder = (ViewHolder)convertView.getTag();
    }

        holder.favCatBtn.setTag(position);
        holder.favCatBtn.setOnClickListener(this);

    return convertView;
 }

@Override
public void onClick(View v) {
    int pos = (Integer) v.getTag();
    Log.d(TAG, "Button row pos click: " + pos);
    RelativeLayout rl = (RelativeLayout)v.getParent();
    holder.favCatBtn = (Button)rl.getChildAt(0);
    holder.favCatBtn.setBackgroundResource(R.drawable.icon_yellow_star_large);

}

因此,如果我单击第 1 行位置的按钮,按钮背景会按预期发生变化。但当我向下滚动列表时,其他按钮也会被设置。有时,当我向上滚动到位置 1 时,按钮背景会再次恢复为原始状态。

我在这里缺少什么?我知道我就在那里,这只是我没有做的一些小事。


是的,你没看错,视图是被回收的。您将需要跟踪哪些位置已被点击并更新您的后台资源getView方法。例如,我扩展了您的代码以添加背景切换:

private final boolean[] mHighlightedPositions = new boolean[NUM_OF_ITEMS];

@Override
public View getView(int position, View convertView, ViewGroup parent){

    if(convertView == null){
        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.todays_sales_favorite_row, null);
        holder.favCatBtn = (Button)convertView.findViewById(R.id.favCatBtn);
        holder.favCatBtn.setOnClickListener(this);
        convertView.setTag(holder);
    }else {
        holder = (ViewHolder)convertView.getTag();
    }

    holder.favCatBtn.setTag(position);

    if(mHighlightedPositions[position]) {
        holder.favCatBtn.setBackgroundResource(R.drawable.icon_yellow_star_large);
    }else {
        holder.favCatBtn.setBackgroundResource(0);
    }

    return convertView;
}

@Override
public void onClick(View view) {
    int position = (Integer)view.getTag();
    Log.d(TAG, "Button row pos click: " + position);

    // Toggle background resource
    RelativeLayout layout = (RelativeLayout)view.getParent();
    Button button = (Button)layout.getChildAt(0);
    if(mHighlightedPositions[position]) {
        button.setBackgroundResource(0);
        mHighlightedPositions[position] = false;
    }else {
        button.setBackgroundResource(R.drawable.icon_yellow_star_large);
        mHighlightedPositions[position] = true;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:使用 onClick 更改 ListView 行中的按钮背景 的相关文章

  • 单击 RecyclerView 内的 ImageView 时更改图像资源

    每当我单击它时 单击图像 而不是项目 我都会尝试更改回收器视图内特定位置的设备图像资源 我尝试将 setOnClickListener 放入 onBindViewHolder 方法中 但只有最后一个项目受到影响 这是我的回收者视图 http
  • 定期运行任务(每天一次/每周一次)

    我想定期 每周 每天一次 运行一些任务 即获取我的网站新闻页面 即使我的应用程序已关闭 是否可以 是的 您需要查看报警管理器 http developer android com reference android app AlarmMan
  • 我可以在 firebase android 中加载另一个用户个人资料图像吗?

    如果我有其他用户的电子邮件但我以其他用户身份登录 我是否可以加载其他用户的个人资料图像 如果您使用 Firebase Storage 那么从技术上讲是的 它只是一个您可以从中检索任何文件的文件系统 如果不伪造您的应用程序 获取 api 密钥
  • Android Studio - 错误:未捕获翻译错误:com.android.dx.cf.code.SimException:本地 0001:无效

    我刚刚使用 Android Studio 设置了一台新计算机 并从 bitbucket 导入了我的项目 问题是我现在在尝试构建项目时遇到此错误 信息 Gradle 任务 app clean app generateDebugSources
  • 如何将画廊意图中的“打开”更改为“完成”?

    我使用以下意图打开画廊来选择多个图像和视频 Intent intent new Intent intent setType image video intent putExtra Intent EXTRA ALLOW MULTIPLE tr
  • 如何使用闹钟音量和 setAudioAttributes 来播放铃声?

    所以我正在尝试了解音频属性 这是我到目前为止所拥有的 alarm getSound will return a proper URI to pick a ringtone Ringtone tone RingtoneManager getR
  • 访问角落里的存储

    我能找到的与文件存储有关的最接近文档的是这个帖子 http nookdeveloper zendesk com entries 20257971 updated what are the size constraints on my app
  • Android中不同线程的数据库访问

    我有一个在 AsyncTasks 中从互联网下载数据的服务 它解析数据并将其存储在数据库中 该服务持续运行 当服务写入数据库时 活动会尝试从数据库中读取更改 我有一个数据库助手 有多种写入和读取方法 这会导致问题吗 可能尝试从两个不同的线程
  • android 确定设备是否采用从右到左的语言/布局

    有没有办法确定设备是否使用从右到左的语言 例如阿拉伯语 而不是从左到右的语言 英语 与较旧的 API 级别 低至 10 兼容的东西是必要的 SOLUTION 我最终在接受的答案中使用了 xml 方法 接下来 我还添加了此处指示的代码 以应对
  • 如何为动态创建的按钮创建 onClick 事件处理程序

    目前 我正在为学生宿舍做一个项目 现在我必须实现一些关于学生的搜索策略 这里 当用户单击 aspx 页面中的另一个服务器按钮时 我必须动态创建一个按钮 因此我必须创建新创建的按钮的 onclick 事件处理程序 我使用的代码片段是 prot
  • 加快 ImageView 中的缩放功能

    我目前正在处理非常大的图像 7 10mb 由于多种原因无法调整大小或压缩 现在 我们的想法是在自定义 ImageView 中显示它们 使用户能够进行双击缩放 捏合缩放等 我使用这个库来完成这项工作 https github com Mike
  • Android 改变 ImageView / Bitmap 的颜色

    我需要找到一种方法来改变 Android 中位图的颜色 我需要在我的应用程序中平滑地替换 更改椭圆形图像的颜色 具体取决于int价值 我需要类似的东西myValue 5比改变我的图像的颜色RED and if myValue 322将颜色更
  • 在 AppAuth-Android 中注销

    我有一个用JAVA开发的Android应用程序 对于这个应用程序 我使用的是身份服务器4 https github com IdentityServer IdentityServer4作为我的 STS 一切正常 但我找不到任何注销的实现Ap
  • android 中camera.setParameters 失败

    我已将相机功能包含在我的应用程序中 我还在市场上推出了该应用程序 我从一位用户那里收到一条错误消息 称他在打开相机时遇到错误 我已经在 2 1 的设备上测试了该应用程序 我从用户那里得到的错误是使用 Nexus One 它主要运行 2 2
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • 如何获取android手机型号、版本、sdk详细信息?

    如何获取android手机型号 版本 sdk详细信息 首先 看看 android sdk 页面上的这些 Build 类 http developer android com reference android os Build html h
  • Android:确定 2.2 及更高版本上的摄像头数量

    我的应用程序需要在 Android 2 2 及更高版本上运行 我需要一种方法来确定可用摄像机的数量 有很多帖子解决了这个问题 但我找不到一个有效的 一种解决方案是简单地检测操作系统版本 任何 2 2 版本的设备都仅限于 1 个摄像头 即使该
  • Android - iphone 风格 tabhost [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • android:layout_alignParentBottom 在没有显式布局高度作为 ListView 中的行的情况下使用时会被忽略

    当我使用RelativeLayout与任一fill parent or wrap content作为高度和一个指定的元素 android layout alignParentBottom true 它被忽略并在顶部对齐 设置高度Relati

随机推荐

  • 如何设置序列特殊字符?

    In my 持续的探索 https stackoverflow com q 5504716 50151为了与一些旧设备连接 我发现供应商提供的软件将特殊字符设置为 00 00 00 00 11 13 但 NET 的 SerialPort 类
  • const 虚函数与非 const 虚函数

    class Base public virtual void func const cout lt lt This is constant base lt
  • 为什么实体框架会生成此 SQL?

    我有这个 LINQ 语句 var carriageways from carriageway in dataModelCurrentEntities Carriageway where carriageway RoadId roadId c
  • 从非最终 keras 模型层获取输出

    我正在使用带有 python 3 的 ubuntu 和基于tensorflow的keras 我正在尝试使用来自预先训练的keras模型的迁移学习来创建一个模型 如下所示here https www learnopencv com keras
  • Zk如何通过id到达包含的.zul页面组件?

    我无法通过包含的 zul 页面中的 id 访问组件 我有一个带有控制器的 main zul 我需要通过 java 控制器类获取包含的 zul 页面中的一个组件 但它返回 null 我知道包含的方法会创建新的 id 空间 但是有什么方法可以获
  • 同步 AJAX 调用在 iPad 上失败,但在其他平台和浏览器上不会失败

    有谁知道为什么同步 ajax 调用会失败并在 iPad 上的 Safari 上给出以下错误 但相同的代码在我迄今为止测试过的所有其他平台和浏览器上都可以正常工作 NETWORK ERR XMLHttpRequest 异常 101 同步请求中
  • MSBuild BuildInParallel,自定义任务生成进程无法运行

    我使用 MSBuild 任务的 BuildInParallel 属性来并行运行生成项目 根项目正在构建四个子项目 子项目使用自定义 MSBuild 任务 该任务使用 System Diagnostics Process 启动新进程 由于某种
  • 在不违反约束的情况下交换两个数据库行

    我有一张桌子regionkey areaid primary key int region char 4 locale char 4 数据库的整个其余部分都是areaid 的外键 在此表中 有一个关于 region locale 的索引 具
  • Textview - 最大长度不适用于椭圆

    我正在尝试创建一个文本视图 以便如果字符数超过 22 则显示省略号 会出现 然而 这不适用于 maxLength
  • 避免在未像素对齐的平铺 SVG 矩形之间出现线条

    我附近有几个rect就像在这个问题 https stackoverflow com questions 13049336 avoid line between tiled svg shapes 但未与像素对齐 我无法更改元素位置 例如 ht
  • 使用带有 Locust 的多 CPU 平台

    I am running htop on the same machine where locust is running during the tests I have been running this morning I see on
  • Xamarin.Forms.WebView 初始加载指示器

    对我来说 采用 Xamarin 表单 WebView 并为第一次加载添加加载进度条的最简单方法是什么 我的应用程序只是包装了一个网站 但在带宽较差的情况下 当启动屏幕消失并且 WebView 正在加载其内容时 我当然会看到白屏 我想看到一个
  • 如何首先在 Entity Framework 5 代码中使用两个外键创建主键?

    我有一个实体 其中主键由另外两个表的两个外键组成 我的配置使用以下内容 但该表是使用两个 FK 引用生成的 桌子 domain Entity1 MorePK PK FK int not null Entity2 Id PK FK int n
  • 禁用 AngularJS 中不需要的验证(条件验证)

    我有一份需要验证的表格 该表单包含许多部分 其中一些部分默认情况下处于禁用状态 每个字段中的值都是正确的 但它违反了我的验证指令 例如 当它被禁用时 它应该包含 0 但是当它可编辑时 它应该包含其他内容 不管怎样 我给它们附加了一个禁用指令
  • C/C++ 中的鲁棒人脸检测?

    我正在寻找一个强大的人脸检测算法 库 最好是 C 语言 C 也可以 如果需要 我可以移植其他语言 我用过OpenCV http opencv willowgarage com 过去的实现 但我不认为它对于轮换是不变的 不需要是实时的 但也不
  • 将 c# 正则表达式转换为 javascript 正则表达式

    使用 C 正则表达式可以使用以下正则表达式
  • 无法从 Cherrypy 将日期时间序列化为 JSON

    我正在尝试发送记录列表以响应 Ajax 查询 这很有效 除非当我的进程因错误而失败时结果包含日期时间字段datetime date 2011 11 1 is not JSON serializable 我试图将我找到的答案结合起来类似的问题
  • 关闭 Google 地图本地点

    我目前有一个网络应用程序 它使用地图 API 绘制兴趣点 但是我注意到一个小烦恼 如果可能的话我想将其关闭 现在 当谷歌地图加载时 它将显示兴趣点和当地商业 市政厅 必胜客等 我不介意标记它们的措辞 但我不希望这些点可点击 就好像使用触摸屏
  • CSS 动画延迟不起作用

    尝试淡入一个 div 7 秒后 淡入另一个 div 我一生都无法弄清楚为什么它不起作用 动画本身可以工作 淡入 淡出动画 但我需要 正在进行的 div 在设定的秒数后淡入 有人知道如何正确执行此操作吗 coming width 320px
  • Android:使用 onClick 更改 ListView 行中的按钮背景

    我的行包含一个按钮 该按钮在我的适配器的 getView 中设置了自己的单击侦听器 我可以使用行父级中的 android descendantFocusability blocksDescendants 来区分按钮点击和实际行项目点击 当我