将ListView的选定项目作为字符串或textview获取时的ClassCastException

时间:2012-10-03 19:28:08

标签: java android

我遇到运行时错误异常:

java.lang.ClassCastException: android.widget.TwoLineListItem cannot be cast to android.widget.TextView

我的活动扩展了活动 ListActivity,这是我的布局构建:

<LinearLayout ...> <ListView ...></ListView> </LinearLayout>

爪哇:

   ListView lv1 = (ListView) findViewById(R.id.listViewXMLdata);
    ArrayAdapter<String> arrAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_2,
        android.R.id.text2, getResources().getStringArray(R.array.countries));

    lv1.setAdapter(arrAdapter);

    lv1.setOnItemClickListener(new OnItemClickListener() {          
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {              
            lView.getItemAtPosition(position);

            String itemSelected = ((TextView) view).getText().toString();
            Toast.makeText(getApplicationContext(), "Clicked Position Number " + position + ": " + itemSelected ,
                    Toast.LENGTH_SHORT)
                    .show();


        }
    });

我唯一关心的问题就是在列表中输入字符串(选中项目)。

注意1 :我不在处理任何数据库。

注意2 :我已经尝试将其强制转换为CharSequence itemSelected =((TextView)视图).getText()。toString()但仍然遇到运行时错误。

仅当我开始选择列表中的项目时才会发生运行时错误。

3 个答案:

答案 0 :(得分:10)

android.R.layout.simple_list_item_2的根目录是TwoLineListItem窗口小部件,其中包含两个子项(两个TextViews),两行文本。将此窗口小部件投射到TextView将失败,但您在logcat中看到的异常将失败。使用TextView搜索所需的findViewById

String itemSelected = ((TextView) view.findViewById(android.R.id.text2)).getText().toString();

答案 1 :(得分:1)

您的ListView正在加载TwoLineListItem类型,您需要将View转换为以下行中的TextView:

String itemSelected = ((TextView) view).getText().toString();

将此更改为:

String itemSelected = ((TwoLineListItem) view).getText1().getText();

应该有用。

编辑:

Android文档位于: http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html 表示:

  

public abstract void onItemClick(AdapterView父视图,View视图,   int position,long id)

     

自:API Level 1回调方法在此项目中调用   已单击AdapterView。

     

如果需要,实施者可以调用getItemAtPosition(position)   访问与所选项目关联的数据。

     

参数

     

parent 发生点击的AdapterView。

     

查看已点击的AdapterView中的视图(这将是一个视图   由适配器提供)

     

位置视图中的位置   适配器。

     

id 点击的商品的行ID。

因此,作为参数传递给方法的视图实际上是一个TwoLineListItem,你应该将视图转换为的类型。

获得对TwoLineListItem的引用后,您可以访问其任何公共成员,包括两个TextViews:

  

公共TextView getText1()

     

从:API级别1返回ID为text1的项目句柄。

     

返回ID为text1的项目句柄。

     

公共TextView getText2   ()

     

从:API级别1返回ID为text2的项目句柄。

     

返回ID为text2的项目句柄。

答案 2 :(得分:0)

此外,你可以查看android.R.layout.simple_list_item_2,然后你会发现布局xml如下:

    <TwoLineListItem xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="?attr/listPreferredItemHeight"
        android:mode="twoLine"
        android:paddingStart="?attr/listPreferredItemPaddingStart"
        android:paddingEnd="?attr/listPreferredItemPaddingEnd">

        <TextView android:id="@id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:textAppearance="?attr/textAppearanceListItem" />

        <TextView android:id="@id/text2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/text1"
        android:layout_alignStart="@id/text1"
        android:textAppearance="?attr/textAppearanceListItemSecondary" />

    </TwoLineListItem>

TwoLineListItem有两个TextView。 希望这会有所帮助。