【问题标题】:Creating own Listview Layout - "LinearLayout cannot be cast to android.widget.TextView" [duplicate]创建自己的 Listview 布局 - “LinearLayout 无法转换为 android.widget.TextView” [重复]
【发布时间】:2016-04-14 14:39:03
【问题描述】:

我只是在观看一些 Android 教程视频来了解它。 目前我正在处理 ListViews,我想创建自己的 ListView 布局。 根据教程,我的代码(MainActivity 的一部分)如下所示:

//        ListAdapter listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, favoriteTVShows);
        ListAdapter listAdapter = new ArrayAdapter<String>(this, R.layout.row_layout, favoriteTVShows);
        ListView listView = (ListView) findViewById(R.id.lv_mainListView);
        listView.setAdapter(listAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String tvShowPicked = "You picked: " + String.valueOf(parent.getItemAtPosition(position));
                Toast.makeText(MainActivity.this, tvShowPicked, Toast.LENGTH_SHORT).show();
            }
        });
    }

当使用第一个注释行(simple_list_item_1)时,它可以工作,但不幸的是,我自己的布局(第二行)不行。

这是我的 row_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="de.oetzi.introductionlistviews.MainActivity"
    android:id="@+id/linearLayout1">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView1"
        android:textSize="30sp"
        android:textStyle="bold"
        android:padding="15dp"/>

</LinearLayout>

最后,有趣的是堆栈跟踪... 顺便说一句,另一个新手问题:我如何从堆栈跟踪中得出哪个类中的哪一行是邪恶的?

04-14 17:17:47.269 406-406/de.oetzi.introductionlistviews E/ArrayAdapter: You must supply a resource ID for a TextView 04-14 17:17:47.272 406-406/de.oetzi.introductionlistviews D/AndroidRuntime: Shutting down VM 04-14 17:17:47.275 406-406/de.oetzi.introductionlistviews E/AndroidRuntime: FATAL EXCEPTION: main
                                                                            Process: de.oetzi.introductionlistviews, PID: 406
                                                                            java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
                                                                                at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:386)
                                                                                at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
                                                                                at android.widget.AbsListView.obtainView(AbsListView.java:2349)
                                                                                at android.widget.ListView.makeAndAddView(ListView.java:1864)
                                                                                at android.widget.ListView.fillDown(ListView.java:698)
                                                                                at android.widget.ListView.fillFromTop(ListView.java:759)
                                                                                at android.widget.ListView.layoutChildren(ListView.java:1673)
                                                                                at android.widget.AbsListView.onLayout(AbsListView.java:2153)
                                                                                at android.view.View.layout(View.java:15678)
                                                                                at android.view.ViewGroup.layout(ViewGroup.java:5039)
                                                                                at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
                                                                                at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
                                                                                at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
                                                                                at android.view.View.layout(View.java:15678)
                                                                                at android.view.ViewGroup.layout(ViewGroup.java:5039)
                                                                                at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:122)
                                                                                at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
                                                                                at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1170)
                                                                                at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:814)
                                                                                at android.view.View.layout(View.java:15678)
                                                                                at android.view.ViewGroup.layout(ViewGroup.java:5039)
                                                                                at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
                                                                                at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
                                                                                at android.view.View.layout(View.java:15678)
                                                                                at android.view.ViewGroup.layout(ViewGroup.java:5039)
                                                                                at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
                                                                                at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
                                                                                at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
                                                                                at android.view.View.layout(View.java:15678)
                                                                                at android.view.ViewGroup.layout(ViewGroup.java:5039)
                                                                                at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
                                                                                at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
                                                                                at android.view.View.layout(View.java:15678)
                                                                                at android.view.ViewGroup.layout(ViewGroup.java:5039)
                                                                                at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
                                                                                at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
                                                                                at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
                                                                                at android.view.View.layout(View.java:15678)
                                                                                at android.view.ViewGroup.layout(ViewGroup.java:5039)
                                                                                at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
                                                                                at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
                                                                                at android.view.View.layout(View.java:15678)
                                                                                at android.view.ViewGroup.layout(ViewGroup.java:5039)
                                                                                at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086)
                                                                                at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843)
                                                                                at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
                                                                                at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5891)
                                                                                at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
                                                                                at android.view.Choreographer.doCallbacks(Choreographer.java:580)
                                                                                at android.view.Choreographer.doFrame(Choreographer.java:550)
                                                                                at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
                                                                                at android.os.Handler.handleCallback(Handler.java:739)
                                                                                at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                at android.os.Looper.loop(Looper.java:135)
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5293)
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
                                                                             Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView
                                                                                at android.widge

【问题讨论】:

  • java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView - 基本上,ArrayAdapter 只接受一种视图 - 一个名为 @android:id/text1 的 TextView
  • 看看 ArrayAdapter.getView 源代码...还要检查构造函数的文档 textViewResourceId 参数

标签: android listview layout


【解决方案1】:

原因是它只能将您的数据放在一个视图项中。因此,在您的布局中,您需要指定一项(在您的情况下为一个 TextView)。将您的 xml 文件更改为如下所示:

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/textView1"
    android:textSize="30sp"
    android:textStyle="bold"
    android:padding="15dp"/>

【讨论】:

  • 这是一种解决方案,但有更好的解决方案
  • @Selvin 什么是更好的解决方案
  • 其他。就像使用 BaseAdapter 而不是 ArrayAdapter。
  • @Shark 确实如此,但它需要重新设计代码,而且 ArrayAdapters 对于具有一个视图的列表也很有效
  • 这样他需要重新设计布局。有什么区别?
【解决方案2】:

更换你的适配器 -

    ArrayAdapter listAdapter = new ArrayAdapter<String>(this, R.layout.row_layout,R.id.textView1, countryArray);
    ListView listView = (ListView) findViewById(R.id.listview);
    listView.setAdapter(listAdapter);

【讨论】:

  • 感谢 Nirel,现在我了解了实际问题。我必须参考一个特定的 TextView。因此,另一个提议的解决方案(由 Pooya 提出)也有效。
猜你喜欢
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
相关资源
最近更新 更多