63

我试图Activity在 Android 中创建一个,这个 Activity 只包含一个ListView没有别的东西。

据我所知,要填充列表视图,我们需要使用ArrayAdapter.

因此,要了解 ArrayAdapter,我已阅读以下链接:

http://developer.android.com/reference/android/widget/ArrayAdapter.html

但是我仍然无法清楚地理解它!

最大的疑问之一是为什么构造函数需要一个TextView资源 id 而我的活动没有我应该给它的任何 TextViews?

我并不是说这是唯一的构造函数,只是我无法理解它背后的逻辑。

为了创建一个简单的列表视图,我还参考了以下链接:

使用 ArrayAdapter 示例的简单 ListView。

但我的主要疑问是为什么它需要 TextView 资源 ID?

如果有人可以用一个例子来解释它,那将非常有帮助。

编辑:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
          android.R.layout.simple_list_item_1, android.R.id.text1, values);
4

8 回答 8

80

ArrayAdapter 使用 TextView 来显示其中的每个项目。在幕后,它使用toString()它持有的每个对象的方法,并将其显示在 TextView 中。ArrayAdapter有许多可以使用的构造函数,您在示例中使用的构造函数是:

ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)

默认情况下,ArrayAdapter 使用默认的 TextView 来显示每个项目。但是,如果您愿意,您可以创建自己的 TextView 并通过扩展 TextView 类来实现您想要的任何复杂设计。然后必须进入布局供您使用。您可以在 textViewResourceId 字段中引用它以将对象绑定到此视图而不是默认值。

为了您的使用,我建议您使用构造函数:

ArrayAdapter(Context context, int resource, T[] objects). 

在您的情况下,这将是:

ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values)

应该没问题。这会将每个字符串绑定到默认的 TextView 显示 - 简单的白色背景。

因此,要回答您的问题,您不必使用 textViewResourceId。

于 2014-01-14T19:19:34.650 回答
21

但再次主要怀疑为什么它需要 TextView 资源 id?

查看构造函数和参数。

public ArrayAdapter (Context context, int resource, int textViewResourceId, T[] objects)

在 API 级别 1 构造函数中添加

参数

context当前上下文。

resource 包含在实例化视图时使用的布局的布局文件的资源 ID。

textViewResourceId 布局资源中 TextView 的 id 要填充的对象 要在ListView.

android.R.id.text1指的是android资源中文本的id。所以你不需要在你的活动中有一个。

这是完整列表

http://developer.android.com/reference/android/R.id.html

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

this指活动上下文

android.R.layout.simple_list_item_1simple_list_item_1 是 android.R.layout 中的布局。

android.R.id.text1指的是android资源id。

values是您提供的链接中的字符串数组

http://developer.android.com/reference/android/R.layout.html

于 2013-09-29T15:05:00.663 回答
4

它需要的 TextView 资源 id 用于 TextView 布局文件,因此它不会在同一个活动中。

您可以通过转到文件 > 新建 > XML > XML 布局文件来创建它,然后在根标记字段中输入小部件类型,即“TextView”。

资料来源:https ://www.kompulsa.com/the-simplest-way-to-implement-an-android-listview/

于 2015-07-20T22:39:59.273 回答
3
public ArrayAdapter (Context context, int resource, int textViewResourceId, T[] objects)

在这里,资源是指您在实例化视图时使用的布局的“id”。

现在,此布局有许多具有自己 id 的子视图。所以,textViewResourceId告诉我们需要用数据填充哪个子视图。

于 2015-07-05T14:25:15.023 回答
2
public ArrayAdapter (Context context, int resource, int textViewResourceId, T[] objects)

我也是Android新手,所以我可能错了。但根据我的理解,将其用于创建列表视图时,第二个参数是列表项的布局。布局由许多视图(图像视图、文本视图等)组成。使用第三个参数,您可以指定要在哪个视图或文本视图中显示文本。

于 2015-01-11T05:58:10.250 回答
2

您不需要为 textview 使用 id。您可以从android arrayadapter了解更多信息。下面的代码初始化数组适配器。

ArrayAdapter arrayAdapter = new ArrayAdapter(this, R.layout.single_item, eatables);
于 2015-01-14T19:01:14.507 回答
1

对于您的问题,答案是android.R.id.text1int:要填充的布局资源中 TextView 的 id。

ArrayAdapter 有很多具有不同数量参数的构造函数,我提到了其中的一些

ArrayAdapter(Context context, int resource)
ArrayAdapter(Context context, int resource, int textViewResourceId)
ArrayAdapter(Context context, int resource, T[] objects)
ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)
ArrayAdapter(Context context, int resource, List<T> objects)
ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)

现在您可以理解每个构造函数都是不同的,并且它们使用了不同的参数列表。

简单的答案是您可以在目标 xml 文件中使用带有文本视图的 ArrayAdapter,也可以不使用。没关系。而且您不需要指定文本视图 ID,您可以在没有它的情况下使用它。但是您可能需要在简单列表视图中使用一些高级选项,您必须使用文本视图。!

这里是示例

ArrayAdapter adapter = new ArrayAdapter<String>(this,R.layout.ListView,StringArray);
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);

这也是您可以更清晰地使用的有效代码。

于 2018-03-25T12:48:04.340 回答
1

如果布局文件中有多个视图,android.R.layout.simple_list_item_1则必须传递第三个参数android.R.id.text1来指定应该用数组元素(值)填充的视图。但是如果您的布局文件中只有一个视图,则无需指定第三个参数。

于 2019-03-06T04:24:19.557 回答