【问题标题】:How to fill cells of a GridView with lists of names?如何用名称列表填充 GridView 的单元格?
【发布时间】:2014-05-28 13:55:54
【问题描述】:

我有一个GridView,我想在其中的每个单元格中填充一个名称列表,并且我需要这些列表可以动态更改。我尝试如下实现这个想法:

public void fillBoard(int groupSize){
    int numGroups = listPresentMembers.size()/groupSize;
    ListView [] groups = new ListView [numGroups];


    for(int i=0;i<numGroups;i++){
        String [] items = new String[groupSize];
        for(int j=0;j<groupSize;j++){

          items[j] = listPresentMembers.get(i*groupSize + j);
        }
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,android.R.id.text1,items);
        groups[i] = new ListView(this);
        groups[i].setAdapter(adapter);
    }
    ArrayAdapter<ListView> groupsAdapter = new ArrayAdapter<ListView>(this,
            android.R.layout.simple_list_item_1,android.R.id.text1,groups);

    gridViewBoard.setAdapter(groupsAdapter);
}

基本的想法是我创建一个ListView 类型的ArrayAdapter,其中的每个项目都由我想填充GridView 的特定单元格的一组名称中的一个定义。然后我将这个ArrayAdapter 设置为我的GridView

问题是当我运行应用程序时,GridView 的元素是字符串,例如 “android.widget.ListView@41bcfa60”。我哪里做错了?

非常感谢!

【问题讨论】:

    标签: android listview gridview android-arrayadapter


    【解决方案1】:

    简短回答:每当您看到“android.widget.ListView@41bcfa60”之类的内容时,这意味着您的代码中的某些内容需要一个字符串,而您给了它一个对象(在本例中为 ListView)。

    那么发生了什么?查看 GridView 的适配器。

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

    这是您正在使用的 ArrayAdapter 的构造函数:

    公共 ArrayAdapter(上下文上下文、int 资源、int textViewResourceId、T[] 对象)

    参数

    context当前上下文。

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

    textViewResourceId要填充的布局资源中TextView的id

    objects ListView 中要表示的对象。

    您将android.R.layout.simple_list_item_1 作为resource 传递,这意味着它是您正在使用的布局。此布局由单个 TextView 组成——单行文本。 它不是为容纳 ListView 而设计的。

    当此布局想要填充 TextView (textViewResourceId) 时,它会查看您传入的数组 (items) 的适当元素并尝试从中获取文本——在 Java 中我们这样做这通过在对象上调用 toString() 来实现。如果 toString() 没有实现,默认情况下它会返回类似“android.widget.ListView@41bcfa60”的乱码。

    这就是原因,但我认为您的代码存在更大的问题。如果我是你,我会强烈重新考虑涉及 GridView 的设计,其中每个网格项都是 ListView。这根本不是传统的,所以可能有更好的方法来完成你想做的任何事情。考虑发布另一个问题来解释您的目标并寻求代码设计帮助。

    【讨论】:

    • 谢谢阿曼达,这很有帮助。在设计帮助方面,也许我可以在提出完整问题之前在 cmets 中纠缠你?本质上,我想建模类似锦标赛的东西:gridview 的每一行都是一个时间段,每个单元格指定在列指示的位置玩的 4 个人。如果这是更推荐的方式,我想我可以把每个人都放在一个牢房里,但是这里的基本想法不适合我的目的吗?谢谢!
    • 与 ListView 一样,GridView 旨在显示一系列项目。通常,每个网格项目的行和列是任意的。想想一个照片应用程序——通常图库会是一系列排列成网格的照片,每张照片的行和列是没有意义的。听起来您尝试显示的信息应该在 table 中,而不是在 grid 中。查看 Android 的 TableLayout
    • 好的,谢谢。我以前从未使用过 TableLayout ......我是否能够拥有动态变化的行数,并且在我的活动的 onCreate 方法中定义列数是否足够容易(我无法在 xml 中定义它,因为它必须依赖于用户输入)?
    • 是的,你应该能够做到这两点......但这变成了一个复杂的问题。我认为您应该发布另一个问题,说明您希望屏幕的外观(您可能会通过提供mockup 获得最佳答案),并寻求具体的设计建议。
    • 好的,我会这样做的。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多