Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >不能将androidx.appcompat.widget.AppCompatTextView转换为android.widget.CheckedTextView

不能将androidx.appcompat.widget.AppCompatTextView转换为android.widget.CheckedTextView
EN

Stack Overflow用户
提问于 2020-04-06 21:07:00
回答 1查看 953关注 0票数 0

我是Java中的android应用程序的新手。示例应用程序应该让我选择我想要在ListView中使用的货币。每次我想从列表中选择一种货币时,应用程序崩溃,我得到错误:

代码语言:javascript
运行
AI代码解释
复制
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.a5_listview, PID: 12333
    java.lang.ClassCastException: androidx.appcompat.widget.AppCompatTextView cannot be cast to android.widget.CheckedTextView
        at com.example.a5_listview.MainActivity$1.onItemClick(MainActivity.java:48)

MainActivity.java

代码语言:javascript
运行
AI代码解释
复制
package com.example.a5_listview;

import androidx.appcompat.app.AppCompatActivity;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckedTextView;
import android.widget.ListView;
import android.widget.Toast;

import com.google.gson.Gson;

import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class MainActivity extends AppCompatActivity {

    List<nbpCurrency> currencies = new ArrayList<>();
    ListView listView;
    Context context;
    ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = findViewById(R.id.listView);
        context = this;

        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                CheckedTextView v = (CheckedTextView) view;
                boolean isCurrentChoice = v.isChecked();
                nbpCurrency currency = (nbpCurrency) listView.getItemAtPosition(position);
                currency.setChosen(isCurrentChoice);
            }
        });
        
        getCurrencies();
    }

    private void getCurrencies() {
        progressDialog = ProgressDialog.show(context, "Getting currencies",
                "Please wait...", true);

        AsyncTask.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    URL nbpEndpoint =
                            new URL("http://api.nbp.pl/api/exchangerates/tables/a/");
                    HttpURLConnection nbpConnection =
                            (HttpURLConnection) nbpEndpoint.openConnection();
                    nbpConnection.setRequestProperty("Accept", "application/json");

                    if(nbpConnection.getResponseCode() == 200) {
                        InputStreamReader is =
                                new InputStreamReader(nbpConnection.getInputStream());
                        Gson gson = new Gson();
                        final nbpCurrencies[] nbpCurrenciesArray = gson.fromJson(is, nbpCurrencies[].class);
                        nbpConnection.disconnect();

                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                currencies.addAll(Arrays.asList(nbpCurrenciesArray[0].getCurrencies()));
                                Collections.sort(currencies);
                                ArrayAdapter<nbpCurrency> arrayAdapter =
                                        new ArrayAdapter<nbpCurrency>(context,
                                                android.R.layout.simple_list_item_1, currencies);
                                listView.setAdapter(arrayAdapter);
                                selectChosen();
                                progressDialog.dismiss();
                            }
                        });
                    } else {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                progressDialog.dismiss();
                                Toast.makeText(context, "There was a problem getting the data",
                                        Toast.LENGTH_LONG).show();
                            }
                        });
                    }
                } catch(Exception e) {
                    e.printStackTrace();

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            progressDialog.dismiss();
                            Toast.makeText(context, "There was a problem getting the data",
                                    Toast.LENGTH_LONG).show();
                        }
                    });
                }
            }
        });
    }

    private void selectChosen() {
        SharedPreferences pref =
                PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        Set<String> chosenCurrenciesCodes = pref.getStringSet("currenciesCodes", new HashSet<String>());

        for(int i = 0; i < currencies.size(); i++) {
            nbpCurrency currency = currencies.get(i);
            if(chosenCurrenciesCodes.contains(currency.getCode())) {
                currency.setChosen(true);
                listView.setItemChecked(i, true);
            }
        }
    }

    public void saveChosen(View view) {
        SharedPreferences pref =
                PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        Set<String> chosenCurrenciesCodes = new HashSet<>();

        for(nbpCurrency currency : currencies) {
            if(currency.isChosen()) {
                chosenCurrenciesCodes.add(currency.getCode());
            }
        }

        pref.edit().putStringSet("currenciesCodes", chosenCurrenciesCodes).apply();
    }
}

activity_main.xml

代码语言:javascript
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
    </ListView>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:onClick="saveChosen"
        android:text="Save"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

nbpCurrencies.java

代码语言:javascript
运行
AI代码解释
复制
package com.example.a5_listview;

import com.google.gson.annotations.SerializedName;

public class nbpCurrencies {
    private String table;
    private String no;
    private String effectiveDate;

    @SerializedName(value = "rates")
    private nbpCurrency[] currencies;

    public String getTable() {
        return table;
    }

    public void setTable(String table) {
        this.table = table;
    }

    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }

    public String getEffectiveDate() {
        return effectiveDate;
    }

    public void setEffectiveDate(String effectiveDate) {
        this.effectiveDate = effectiveDate;
    }

    public nbpCurrency[] getCurrencies() {
        return currencies;
    }

    public void setCurrencies(nbpCurrency[] currencies) {
        this.currencies = currencies;
    }
}

nbpCurrency.java

代码语言:javascript
运行
AI代码解释
复制
package com.example.a5_listview;

class nbpCurrency implements Comparable<nbpCurrency> {
    private String currency;
    private String code;
    private double mid;

    private transient boolean chosen = false;

    public nbpCurrency() {
    }

    public String getCurrency() {
        return currency;
    }

    public void setCurrency(String currency) {
        this.currency = currency;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public double getMid() {
        return mid;
    }

    public void setMid(double mid) {
        this.mid = mid;
    }

    public boolean isChosen() {
        return chosen;
    }

    public void setChosen(boolean chosen) {
        this.chosen = chosen;
    }

    @Override
    public String toString() {
        return String.format("%s [%s: %.3f]", code, currency, mid);
    }

    @Override
    public int compareTo(nbpCurrency nbpCurrency) {
        return code.compareTo(nbpCurrency.getCode());
    }
}

在日志中,我可以看到导致所有混乱的代码行:CheckedTextView v = (CheckedTextView) view;

该错误的原因是什么?我已经在StackOverflow上查看了其他答案,但我仍然找不到任何解决方案。也许我只是看不到一个明显的错误。谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-06 21:23:11

代码语言:javascript
运行
AI代码解释
复制
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                CheckedTextView v = (CheckedTextView) view;
                boolean isCurrentChoice = v.isChecked();
                nbpCurrency currency = (nbpCurrency) listView.getItemAtPosition(position);
                currency.setChosen(isCurrentChoice);
            }
        });

您可以在这里设置一个ClickListener。适配器返回的view字段为TextView。这就是你获得CastException的方式。在这个方法中,您还可以获得idposition字段,并且可以使用它们。

如果您希望启用多项选择,则需要使用如下所示的另一个布局构建ArrayAdapter

代码语言:javascript
运行
AI代码解释
复制
ArrayAdapter<nbpCurrency> arrayAdapter =
    new ArrayAdapter<nbpCurrency>(context,
        android.R.layout.simple_list_item_multiple_choice, currencies);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61068990

复制
相关文章
温故而知新,ggplot2 饼图的几点笔记
其实 ggplot2 并没有类似于 geom_pie() 这样的函数实现饼图的绘制,它是由 geom_bar() 柱状图经过 coord_polar() 极坐标弯曲从而得到的。 对于为什么 ggplot2 中没有专门用于饼图绘制的函,有人说:“柱状图的高度,对应于饼图的弧度,饼图并不推荐,因为人类的眼睛比较弧度的能力比不上比较高度(柱状图)。” 关于饼状图被批评为可视化效果差,不推荐在 R 社区中使用的文章在网络也有不少,感兴趣的可以去搜一下。
章鱼猫先生
2021/10/15
1.4K0
温故而知新,ggplot2 饼图的几点笔记
与 ggplot2 包相关的 109 种拓展包
该网站一共汇总了 109 种与ggplot2 包相关的拓展包,并且在不断更新中。拓展包与 ggplot2 包可以无缝连接。
庄闪闪
2022/04/08
7900
与 ggplot2 包相关的 109 种拓展包
R相关性图如何按比例显示相关系数
今天偶然从一篇paper里看到了一张R绘制的相关性图,跟以往看到的有些不一样。这张图里面不仅展示了相关系数,并且相关系数显示的大小跟相关系数是成比例的。这样做的好处是,让那些最显著相关的一目了然,而那些不怎么相关的就不那么显眼。这个引起了小编的兴趣,想自己也画一张这样的相关性图。
生信交流平台
2022/09/21
1.1K0
R相关性图如何按比例显示相关系数
C++核心准则​NL.7:使名称的长度与作用域的大小大致成比例
Rationale: The larger the scope the greater the chance of confusion and of an unintended name clash.
面向对象思考
2020/11/26
4060
教程 | OpenCV4中的极坐标变换
极坐标变换就是将图像在直角坐标系与极坐标系中互相变换,形式如图3-26所示,它可以将一圆形图像变换成一个矩形图像,常用于处理钟表、圆盘等图像。圆形图案边缘上的文字经过及坐标变换后可以垂直的排列在新图像的边缘,便于对文字的识别和检测。
OpenCV学堂
2019/12/06
4.1K1
教程 | OpenCV4中的极坐标变换
webgis中的比例尺实现
比例尺在地图中是一个非常重要的概念,有着辅助读图的作用。本文在ol框架下,实现webgis中的比例尺功能。
牛老师讲GIS
2021/12/06
6830
webgis中的比例尺实现
谷歌:Android 内存安全漏洞比例下降与使用 Rust 相关
根据谷歌安全消息,十多年来,内存安全漏洞一直占整个产品和整个行业漏洞的 65% 以上。但近期在 Android 上,内存安全漏洞显着减少,并且相关的漏洞严重性也有所下降。 “从 2019 年到 2022 年,内存安全漏洞的年度数量从 223 个下降到 85 个,”Android 安全工程师 Jeffrey Vander Stoep 在博客文章中说道。Jeffrey 表示,这种下降与放弃内存不安全编程语言的努力相吻合,这里的“内存不安全编程语言”指的是 C/C++。 从去年的 Android 12 开始,R
深度学习与Python
2023/03/29
4150
谷歌:Android 内存安全漏洞比例下降与使用 Rust 相关
ggplot2中 ggsave如何用?
这里面,用()将ggplot作图的代码括住,它会输出到屏幕上,使用%>%将其作为对象传递给ggsave,用.表示它,写作ggsave("plot3.png",.),即可。
邓飞
2021/01/12
4.6K0
css中如何做到容器按比例缩放
图片因为本身存在宽高比,所以设置一个值,另一个值自动也就根据真实的比例对应上,但是如果是视频呢?
用户1097444
2023/07/14
8210
css中如何做到容器按比例缩放
css中如何做到容器按比例缩放
图片因为本身存在宽高比,所以设置一个值,另一个值自动也就根据真实的比例对应上,但是如果是视频呢?
IMWeb前端团队
2019/12/03
1.7K0
css中如何做到容器按比例缩放
R可视乎|饼图
饼图(pie chart)被广泛地应用于各个领域,用于表示不同分类的占比情况,通过弧度大小来对比各种分类。饼图通过将一个圆饼按照分类的占比划分成多个切片,整个圆饼代表数据的总量,每个切片(圆弧)表示该分类占总体的比例,所有切片(圆弧)的加和等于100%。
庄闪闪
2021/04/09
1.5K0
弧度和角度的转换_角度与弧度的换算表格
这两天在看同事写的四叉树代码,当中用到了孤度和角度之间的转换,所以转载此文章进行了学习
全栈程序员站长
2022/09/20
1.1K0
pytorch中与维度相关的函数、方法
多个tensor向量在某个维度上进行堆叠。注意的是:stack只是torch的函数。
木又AI帮
2020/05/20
1.1K0
DAX中与计数相关的聚合函数
不问花开几许,只愿浅笑安然 除了求和,另一个日常工作中最常用到的聚合方式应该是计数了。DAX提供了一系列关于计数的函数。他们可以帮助我们计算表中有多少行或者某个值出现了多少次。 DAX中包含的计数函数有: COUNT()函数,对列中值的数量进行计数,除了布尔型; COUNTA函数,对列中值的数量进行计数,包含布尔型; COUNTBLANK()函数,返回列中空单元格的计数; COUNTROWS()函数,返回表中行的计数; DISTINCTCOUNT()函数,返回列中值的不重复计数,包含空单元格。 DISTI
博文视点Broadview
2023/04/04
4.3K0
DAX中与计数相关的聚合函数
Linux中几个与文档相关的命令
一、介绍 本文将介绍几个与文档相关的命令 软件环境: 物理机 Windows 8.0 虚拟机 VMware Workstation 12 Linux系统 CentOS 7.3 二、命令cat 命令ca
Zoctopus
2018/06/04
1.1K0
R语言ggplot2作图如何去掉图例中的NA
https://stackoverflow.com/questions/45493163/ggplot-remove-na-factor-level-in-legend
用户7010445
2021/07/12
4.5K0
R语言ggplot2作图如何去掉图例中的NA
曝光埋点方案:recyclerView中的item曝光逻辑实现
首先,客户端要考虑的就是只管调用api上报:上报item可见、上报item不可见。至于是否是有效曝光,就是公共埋点SDK(中台提供)去计算了。
胡飞洋
2020/07/23
5.9K0
曝光埋点方案:recyclerView中的item曝光逻辑实现
如何使Ubuntu的语言变成中文??
当我们打开Ubuntu系统后,一些英语稍差一点的同学是不是用这个系统用起来感觉有点吃力呢?要是Ubuntu系统会讲中文就好了。那如何让Ubuntu这个系统学会中文呢?接下来就有我来带你们一步步的让自己的Ubuntu系统学会中文吧!! ## (注意:可能有些步骤需要输入你的登录密码!!!)
种花家的奋斗兔
2020/11/13
4.3K0
如何使Ubuntu的语言变成中文??
点击加载更多

相似问题

ggplot2:极坐标中的连接点与直线2

11

打印与固定比例相关的值

22

计算与棒球相关的查询的比例

11

如何使图解极坐标图上0°的角度顺时针旋转?

53

R- ggplot2:极坐标与直线的连接点

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档