如何使用名称列表填充GridView的单元格?

时间:2014-05-28 05:09:31

标签: android listview gridview android-arrayadapter

我有一个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);
}

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

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

非常感谢!

1 个答案:

答案 0 :(得分:2)

简短的回答:无论何时你看到像“android.widget.ListView@41bcfa60”这样的东西,都意味着你的代码中有些东西需要一个String而你给它一个对象(在本例中是一个ListView)。

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

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

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

  

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

     

参数

     

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。这根本不是传统的,所以可能有更好的方法来完成你想要做的任何事情。考虑发布另一个问题来解释您的目标并要求代码设计帮助。