对用于显示列表的 Textview 和 Listview 感到困惑

confused about Textview and Listview for displaying a list

我尝试了几种不同的布局以更深入地了解可能性和差异。 我从一个数组开始,在一个工作正常的列表视图中显示项目。

现在我想显示通过 JSON 从数据库中获取的项目。

我收到以下错误:您必须为 TextView 提供资源 ID

我使用了相同的 XML-文件,以前有效,这里是我的 all_products.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">

    <ListView
        android:id="@+id/mobile_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@color/colorPrimaryDark"
        android:dividerHeight="1px">
    </ListView>

</LinearLayout>

在我的 java class 中,我使用了之前用于数组适配器的代码,我只更改了应该显示的参数。这是我的一部分 AllProductsActivity.java:

 private void processValue(ArrayList<String> result) {
    {
        ArrayAdapter adapter = new ArrayAdapter<String>(AllProductsActivity.this, R.layout.all_products, result);
        ListView listView = (ListView) findViewById(R.id.list);
        listView.setAdapter(adapter);
    }
}

结果来自我的异步任务。这里还有一个片段:

JSONArray jsonArray = new JSONArray(result.toString())
ArrayList<String> listdata = new ArrayList<String>();
for(int n = 0; n < jsonArray.length(); n++)
{
    JSONObject object = jsonArray.getJSONObject(n);
    listdata.add(object.optString("nr"));
}
return listdata;
 protected void onPostExecute( ArrayList<String> result) {      
     pdLoading.dismiss();
     processValue(result);
 }

为什么我会收到错误消息?也许只使用一个 Textview 怎么样?当我搜索主题时,我发现人们使用 Textviews 而不是 Listview 的不同威胁。 编辑:所以我添加了另一个 xml 文件,mytextview.xml

<TextView android:id="@+id/mytext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@color/colorPrimaryDark"
android:dividerHeight="1px"
xmlns:android="http://schemas.android.com/apk/res/android">

并将适配器语句更改为以下内容:

            ArrayAdapter adapter = new ArrayAdapter<String>(AllProductsActivity.this,
                R.layout.mytextview,R.id.mytext  , result);
        ListView listView = (ListView) findViewById(R.id.mobile_list);
        listView.setAdapter(adapter);

当您使用自定义布局时 R.layout.all_products 适配器不知道要从数据列表设置数据的视图

所以您只需要告诉适配器,要在其上设置数据的文本视图的 ID。

 ArrayAdapter adapter = new ArrayAdapter<String>
                     (AllProductsActivity.this,
                      R.layout.all_products,R.id.your_text_view_id, result);
//                                               ^^^^^^^^^ pass the text view ID

ArrayAdapter (上下文上下文, 内部资源, int textViewResourceId, T[] 个对象)

如果您只想显示您的数据而不需要任何自定义布局,那么可以在构建 android 资源布局中使用

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,result);

在实例化您的 ArrayAdapter 时,您提供的 ID 必须来自仅包含 TextView 的布局。这就是错误 You must supply a resource ID for a TextView 的意思

在 Pavneet 的第一个解决方案中注意:

资源: 是包含 textView 的资源而不是包含列表本身的 xml 文件(不是 R.layout.all_products)

textViewResourceId:资源中包含的textView的ID