K. Barresi
K. Barresi

Reputation: 1315

ListAdapter from a HashMap

I'm trying to get my ArrayList of HashMaps to try to get a working ListAdapter. When I run this, I'm getting a

java.lang.RuntimeException: Your content must have a ListView whose id attribute is android.R.id.list

error. Here's what I have:

gameList is where I'm getting my data from:

gameList.toString() returns: [{turn=1, opponent=UserTwo, streak=4, hintX=1234, player=UserOne, solution=MySolution, hintY=5678}, {turn=0, opponent=UserThree, streak=12, hintX=1344, player=UserOne, solution=SolutionTwo, hintY=5428}]

My ListActivity class:

public class GameListActivity extends ListActivity{

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.game_list);

    String GAME_ITEM = "game";
    String PLAYER_ITEM = "player";
    String OPPONENT_ITEM = "opponent";
    String SOLUTION_ITEM = "solution";
    String HINTX_ITEM = "hintX";
    String HINTY_ITEM = "hintY";
    String STREAK_ITEM = "streak";
    String TURN_ITEM = "turn";

ArrayList<HashMap<String, String>> gameList = new ArrayList<HashMap<String, String>>();
AppVars gameVars = ((AppVars) getApplicationContext());
gameList = gameVars.getState();

String[] keyList = new String[] { OPPONENT_ITEM, STREAK_ITEM, TURN_ITEM };

ListAdapter adapter = new SimpleAdapter(this, gameList, R.layout.game_list_item, 
                        keyList, 
                        new int[] {R.id.opponent, R.id.streak, R.id.turn});
setListAdapter(adapter);        

}   

XML:

game_list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="5dp" >

    <ImageView
        android:id="@+id/thumbnail"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentTop="true"
        android:src="@android:drawable/alert_dark_frame" />

    <TextView
        android:id="@+id/opponent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/thumbnail"
        android:layout_centerHorizontal="true"
        android:text="Entry"
        android:textSize="30sp" />

    <TextView
        android:id="@+id/streak"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/thumbnail"
        android:layout_centerHorizontal="true"
        android:text="Streak"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/turn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/streak"
        android:layout_centerHorizontal="true"
        android:text="Your turn!"
        android:textSize="20sp" />

</RelativeLayout>

game_list.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/blackboard" >

    <ListView
        android:id="@+id/gameList"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >
    </ListView>

</RelativeLayout>

Upvotes: 0

Views: 143

Answers (5)

znat
znat

Reputation: 13474

Remove the following line from your code:

setContentView(...)

ListActivity handles the ListView for you so you access the ListView using this. If you need a more complex layout subclass Activity instead.

Upvotes: 0

Simon Dorociak
Simon Dorociak

Reputation: 33505

java.lang.RuntimeException: Your content must have a ListView whose id attribute is android.R.id.list

So error log tells you everything

You need to add to your XML file of ListView android.R.id.list

<ListView
   android:id="@android:id/list"
   // next attributes
/>

Exactly when your Activity extends from ListActivity, you should to use this.

Here is info from docs

ListActivity has a default layout that consists of a single, full-screen list in the center of the screen. However, if you desire, you can customize the screen layout by setting your own view layout with setContentView() in onCreate(). To do this, your own view MUST contain a ListView object with the id "@android:id/list" (or list if it's in code)

So for more information have look at ListActivity.

Upvotes: 1

Dheeresh Singh
Dheeresh Singh

Reputation: 15701

id of list is "@+id/gameList" should be "@android:id/list" as you are using ListActivity...

Upvotes: 1

kosa
kosa

Reputation: 66637

You are extending ListActivity, so your view should have list defined with id "list"

See this link for working example.

Upvotes: 1

Samir Mangroliya
Samir Mangroliya

Reputation: 40416

  • Mind that When you extends ListActivity Then your xml file must have listview which id is @android:id/list.

USe @android:id/list

  <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >
    </ListView>

Upvotes: 1

Related Questions