I have a GridView
, each cell of which I would like to populate with a list of names, and I need these lists to be dynamically changeable. I tried implementing this idea as follows:
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);
}
The essential idea is that I create an ArrayAdapter
of type ListView
, each item of which is defined by one of the groups of names I would like to populate a particular cell of the GridView
. I then set this ArrayAdapter
to my GridView
.
The problem is that when I run the app, the elements of the GridView
are strings such as
"android.widget.ListView@41bcfa60". Where did I go wrong?
Thanks very much!
Short answer: whenever you see something like "android.widget.ListView@41bcfa60", it means that something in your code was expecting a String and you gave it an object (in this case, a ListView) instead.
So what happened? Take a look at the adapter for your GridView.
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,android.R.id.text1,items);
Here's the constructor for the ArrayAdapter you're using:
public ArrayAdapter (Context context, int resource, int textViewResourceId, T[] objects)
Parameters
context
The current context.
resource
The resource ID for a layout file containing a layout to use when instantiating views.
textViewResourceId
The id of the TextView within the layout resource to be populated
objects
The objects to represent in the ListView.
You're passing android.R.layout.simple_list_item_1
as the resource
, which means it's the layout you're using. This layout consists of a single TextView--a single line of text. It is not designed to hold a ListView.
When this layout wants to populate the TextView (the textViewResourceId
), it looks at the appropriate element of the array (items
) that you passed in and tries to get text out of it--in Java we do this by calling toString() on an object. If toString() is not implemented, by default it returns something like the "android.widget.ListView@41bcfa60" gibberish that you got.
That's the why, but I think your code has bigger problems. If I were you, I'd strongly reconsider a design that involves a GridView where each grid item is a ListView. That is not conventional at all, so there's probably a better way to accomplish whatever you're trying to do. Consider posting another question explaining your goal and asking for code design help.