Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Android自定义适配器清单1选择会导致多个选择

Android自定义适配器清单1选择会导致多个选择
EN

Stack Overflow用户
提问于 2015-02-12 06:44:50
回答 2查看 415关注 0票数 0

我有一个具有自定义适配器的listview,其中有一个切换按钮、一个旋转器和一些其他视图。

这个列表视图显示的项目比一般情况下的一个屏幕更多,这导致了一个奇怪的问题,我不明白。

例如:当我按下列表中第一项的切换按钮时,背景会改变颜色。如果我向下滚动到“第二屏幕”(第10-18项),我注意到第11项也被“切换”了,因为背景也发生了变化。如果我再向下滚动,向下滚动到第20项,也会被选中。

我的适配器看起来如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ArticlesListAdapter extends ArrayAdapter<Line> {

private List<Line> lineList;
private Context context;

public ArticlesListAdapter(Context context, int textViewResourceId,
        List<Line> objects) {
    super(context, textViewResourceId, objects);
    this.lineList = objects;
    this.context = context;
}

public int getCount() {
    return lineList.size();
}

public Line getItem(int position) {
    return lineList.get(position);
}

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

public List<Line> GetAllLines() {
    return lineList;

}

@SuppressLint("InflateParams")
public View getView(int position, View convertView, ViewGroup parent) {

    Viewholder viewholder;

    if (convertView == null) {
        viewholder = new Viewholder();
        convertView = LayoutInflater.from(context).inflate(
                R.layout.articles_list_row, null);

        viewholder.articleName = (TextView) convertView
                .findViewById(R.id.textArticleName);
        viewholder.articleAmount = (EditText) convertView
                .findViewById(R.id.textArticleAmount);
        viewholder.articleButton = (ToggleButton) convertView
                .findViewById(R.id.toggleArticleReturn);
        viewholder.articleStock = (Spinner) convertView
                .findViewById(R.id.spinStockWarehouse);

        convertView.setTag(viewholder);
    } else {
        viewholder = (Viewholder) convertView.getTag();
    }

    viewholder.articleButton.setTag(position);

    if (lineList.get(position).getLineCode().length() > 0) {
        viewholder.articleButton.setOnClickListener(RetourArticleListener);
        viewholder.articleButton.setOnLongClickListener(RetourCertainAmountArticleListener);
    } else {
        viewholder.articleButton.setText("Delete");
        viewholder.articleButton.setOnClickListener(DeleteArticleListener);
    }

    String articleNameString = lineList.get(position)
            .getLineArticleDescription();
    if (articleNameString.length() > 30) {
        articleNameString.substring(0, 30);
    }
    viewholder.articleName.setText(articleNameString);
    viewholder.articleName.setTextSize(12);

    viewholder.articleAmount.setTag(position);
    viewholder.articleAmount.setTextSize(12);
    viewholder.articleAmount.setText(lineList.get(position)
            .getLineArticleAmount().toString());

    if (lineList.get(position).isLineArticleIsOriginal()) {
        viewholder.articleStock.setEnabled(false);
    }
    viewholder.articleStock.setSelection(Integer.parseInt(lineList
            .get(position).getLineArticleStock().toString()) - 1);
    viewholder.articleStock.setTag(position);
    viewholder.articleStock
            .setOnItemSelectedListener(new OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> adapterView,
                        View view, int position, long id) {
                    final int listPosition = (Integer) adapterView.getTag();
                    lineList.get(listPosition).setLineArticleStock(
                            String.valueOf(position + 1));
                }

                @Override
                public void onNothingSelected(AdapterView<?> adapter) {
                }
            });

    // we need to update adapter once we finish with editing
    viewholder.articleAmount
            .setOnFocusChangeListener(new OnFocusChangeListener() {
                public void onFocusChange(View v, boolean hasFocus) {
                    if (!hasFocus) {
                        final int position = (Integer) v.getTag();
                        final EditText articleAmount = (EditText) v;
                        lineList.get(position).setLineArticleAmount(
                                Double.parseDouble(articleAmount.getText()
                                        .toString().replace(",", ".")));
                    }
                }
            });

    return convertView;
}

private OnClickListener RetourArticleListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        boolean on = ((ToggleButton) v).isChecked();
        int position = (Integer) v.getTag();
        RelativeLayout rl = (RelativeLayout) v.getParent();
        if (on) {
            // Article returned
            rl.setBackgroundColor(Color.RED);
            lineList.get(position).setLineArticleReturned(true);
        } else {
            // Article used
            rl.setBackgroundColor(Color.WHITE);
            lineList.get(position).setLineArticleReturned(false);
        }

    }
};
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-12 08:13:39

正如Alex.F指出的,问题在于ListView的回收行为。解决方案非常简单:

Line已经有一个与颜色状态相对应的布尔值,我们将使用这个布尔值。

在您的RetourArticleListener中,将if-else语句更改为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (on) {
     // Article returned
     lineList.get(position).setLineArticleReturned(true);
     notifyDatasetChanged();
} else {
     // Article used
     lineList.get(position).setLineArticleReturned(false);
     notifyDatasetChanged();
}

notifyDatasetChanged方法将确保调用getView()方法。

在getView()方法中,检查"LineArticleReturned“的值,并相应地更改背景色。将其添加到getView方法末尾的某个位置,以确保到那时所有必需的变量都已初始化。我假设您有一个名为getLineArticleReturned()的方法,它在Line中返回LineArticleReturned的布尔值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 if(lineList.get(position).getLineArticleReturned()==true){
     RelativeLayout rl = (RelativeLayout)          
     convertView.findViewById(R.id.name_of_your_relative_layout_here);
     rl.setBackgroundColor(Color.RED);

 }else{
     rl.setBackgroundColor(Color.WHITE);
 }
票数 2
EN

Stack Overflow用户

发布于 2015-02-12 06:52:16

这是一个与listView的回收机制有关的问题。您应该阅读它,例如在this SO Q&A中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28480394

复制
相关文章
T-SQL查询语句
1、SQL的组成: ①DML:数据操纵语句 select、insert、delete、update ②DDL:数据定义语句 create、alter、drop ③DCL:数据控制语句 grant、revoke 2、查询语句:select select 列名1,列名2,…… [into 新表名称] from 表名 [where 条件表达式] [order by 列名 排序方式] 排序 [group by 表达式] 分
L宝宝聊IT
2018/06/20
9650
浅谈 T-SQL高级查询
之前我们简单的了解了增、删、改、查这几类T-SQL语法来操纵数据表,但是为了更方便快捷地完成大量任务,SQL Server 提供了一些内部函数,可以和SQL Server 的SELECT语句来联合使用,进行类型转换、日期处理、数学计算、实现系统功能。
小手冰凉
2019/09/10
1.7K0
浅谈 T-SQL高级查询
SQLServer T-SQL 部分查询语句归纳
通过某一约束条件 (ON table.XXX = table2.XXX) 进行关联,如果表中有至少一个匹配,则返回行,输出查询的字段。
李郑
2019/12/04
1.4K0
SQL Server T-SQL高级查询
高级查询在数据库中用得是最频繁的,也是应用最广泛的。 Ø 基本常用查询 --select select * from student;   --all 查询所有 select all sex from student;   --distinct 过滤重复 select distinct sex from student;   --count 统计 select count(*) from student; select count(sex) from student; select count(distin
磊哥
2018/04/26
3.9K0
T-SQL基础(一)之简单查询
SQL: Structured Query Language,结构化查询语言,是一种在关系型数据库中用于管理数据的标准语言。SQL是一种声明式编程语言,即只需表明需要什么而无需关注实现细节(C#中的LINQ也是如此)。
雪飞鸿
2018/11/02
4.2K0
【T-SQL基础】02.联接查询
概述: 本系列【T-SQL基础】主要是针对T-SQL基础的总结。 本篇主要是对多表查询基础的总结。 查询语句的FROM字句在逻辑上是第一条要处理的字句,在FROM字句内可以用表运算符对输入的表进行操作
悟空聊架构
2018/05/18
3K0
【T-SQL基础】03.子查询
以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化。 本系列【T-SQL基础】主要是针对T-SQL基础的总结。 练习题: 1.写一条查询语句,返回Orders表中
悟空聊架构
2018/05/18
1.9K0
T-SQL基础(二)之关联查询
表运算符的作用是把为其提供的表作为输入,经过逻辑查询处理,返回一个表结果。SQL Server支持四个表运算符:JOIN、APPLY、PIVOT、UNPIVOT,其中JOIN是标准SQL中的运算符,APPLY、PIVOT和UNPIVOT是T-SQL的扩展。
雪飞鸿
2018/11/14
2.2K0
T-SQL基础(二)之关联查询
T-SQL基础(二)之关联查询
表运算符的作用是把为其提供的表作为输入,经过逻辑查询处理,返回一个表结果。SQL Server支持四个表运算符:JOIN、APPLY、PIVOT、UNPIVOT,其中JOIN是标准SQL中的运算符,APPLY、PIVOT和UNPIVOT是T-SQL的扩展。
雪飞鸿
2018/12/12
2.1K0
T-SQL 查询、修改数据表
T-SQL修改表数据 INSERT语句 语法: INSERT [TOP(expression) [PERCENT]] [INTO]   { <object> | rowset_function_limited     [ WITH ( <Table_Hint_Limited> [ ...n ] ) ] /*指定表提示*/     | view_name } /*视图名*/   {     [(column_list) ]
欠扁的小篮子
2018/04/09
1.3K0
【T-SQL基础】01.单表查询-几道sql查询题
概述: 本系列【T-SQL基础】主要是针对T-SQL基础的总结。 本篇主要总结了常见的对单表查询的SQL查询题目。 首先我们必须了解SQL查询的各字句在逻辑上按以下顺序进行处理: 1.FROM 2.W
悟空聊架构
2018/05/18
2K0
Windows server 2016——SQL server T-SQL查询语句
本系列文章将会讲解SQL server 中 server T-SQL查询语句,并且会同步视频进行安装讲解。
网络豆
2023/10/17
2500
Windows server 2016——SQL server T-SQL查询语句
《SQLSERVER2012之T-SQL教程》T-SQL单表查询(二)「建议收藏」
表结构与数据:https://github.com/XuePeng87/TSQLV4
全栈程序员站长
2022/07/19
1.8K0
《T-SQL查询》读书笔记Part 1.逻辑查询处理知多少
  T-SQL是ANSI和ISO SQL标准的MS SQL扩展,其正式名称为Transact-SQL,但一般程序员都称其为T-SQL。
Edison Zhou
2018/08/21
1.1K0
《T-SQL查询》读书笔记Part 1.逻辑查询处理知多少
T-SQL进阶:超越基础 Level 2:编写子查询
By Gregory Larsen, 2016/01/01 (首次发布于: 2014/01/29) 关于系列 本文属于进阶系列:T-SQL进阶:超越基础 跟随Gregory Larsen的T-SQL DML进阶系列,其涵盖了更多的高级方面的T-SQL语言,如子查询。 在您开始创建超出基本Transact-SQL语句的更复杂的SQL代码时,您可能会发现需要使用其他SELECT语句的结果来限制查询。 当在父Transact-SQL语句中嵌入SELECT语句时,这些嵌入式SELECT语句被称为子查询或相关子查询。
Woodson
2018/07/18
6K0
《T-SQL查询》读书笔记Part 2.执行计划
  在SSMS(SQL Server Management Studio)中,有两种图形化的执行计划可供选择。一种是估计执行计划(Ctrl+L键),另一种是实际执行计划(Ctrl+M键)。两种计划通常都是一样的,只是执行时间点不同。估计查询计划是在查询执行之前生成,而实际执行计划则是在查询输出的同时得到的。
Edison Zhou
2018/08/21
3460
《T-SQL查询》读书笔记Part 2.执行计划
T-SQL基础(三)之子查询与表表达式
在嵌套查询中,最外面查询结果集返回给调用方,称为外部查询。嵌套在外部查询内的查询称为子查询,子查询的结果集供外部查询使用。
雪飞鸿
2018/12/19
1.5K0
【T-SQL进阶】02.理解SQL查询的底层原理
本系列【T-SQL】主要是针对T-SQL的总结。 一、SQL Server组成部分 1.关系引擎:主要作用是优化和执行查询。 包含三大组件: (1)命令解析器:检查语法和转换查询树。 (2)查询优化器
悟空聊架构
2018/06/26
1.7K0
【T-SQL进阶】02.理解SQL查询的底层原理
本系列【T-SQL】主要是针对T-SQL的总结。 一、SQL Server组成部分 1.关系引擎:主要作用是优化和执行查询。 包含三大组件: (1)命令解析器:检查语法和转换查询树。 (2)查询优化器
悟空聊架构
2018/05/18
1.1K0
T-SQL基础(三)之子查询与表表达式
在嵌套查询中,最外面查询结果集返回给调用方,称为外部查询。嵌套在外部查询内的查询称为子查询,子查询的结果集供外部查询使用。
雪飞鸿
2018/11/24
1.6K0

相似问题

T-SQL动态查询和枢轴

24

通过枢轴查询的t-sql组

20

T-SQL动态枢轴查询和SQL注入保护

110

T-SQL :不带聚合的枢轴表

11

t-sql辅助枢轴在旋转表上

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文