I have a ListActivity that I'm trying to bind to an array of business objects using a custom ArrayAdapter.
When I run the application on either the emulator or the real android device I get a null reference in the ArrayAdapter on the line "holder.txtTeam1.setText(info.Team1);". After doing some debugging it looks like the call to inflate the layout didn't actually create the child TextViews, it only created the outter TableLayout.
This is all based on a tutorial I found on the internet, and I've been banging my head off the desk for almost a week on this one. Can anyone tell me what I'm doing wrong?
The activity looks like this:
public class BaseballPressActivity extends ListActivity {
private GameDataAdapter adapter;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adapter = new GameDataAdapter(this, new GameData[]{new GameData("3:10pm","Team 1","Team 2")});
this.setListAdapter(adapter);
}
}
The ArrayAdapter looks like this:
public class GameDataAdapter extends ArrayAdapter<GameData> {
Context context;
GameData data[] = null;
public GameDataAdapter(Context context, GameData[] data) {
super(context,R.layout.listitem_game, R.id.Name1, data);
this.context = context;
this.data = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
GameViewHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(R.layout.test , parent, false);
holder = new GameViewHolder();
holder.txtTeam1 = (TextView)row.findViewById(R.id.Name1);
row.setTag(holder);
}
else
{
holder = (GameViewHolder)row.getTag();
}
GameData info = data[position];
holder.txtTeam1.setText(info.Team1);
return row;
}
static class GameViewHolder
{
TextView txtTeam1;
TextView txtTeam2;
TextView txtGameTime;
}
}
And the layout for the list activity item looks like this:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TableRow android:id="@+id/tableRow1" android:layout_width="wrap_content" android:layout_height="wrap_content">
<TextView android:text="TextView" android:layout_weight="0" android:id="@+id/textView1" android:layout_height="wrap_content" android:layout_width="0dp"></TextView>
<ImageView android:id="@+id/imageView1" android:src="@drawable/icon" android:layout_height="wrap_content" android:layout_weight="0" android:layout_width="0dp"></ImageView>
<LinearLayout android:id="@+id/linearLayout1" android:orientation="vertical" android:layout_height="wrap_content" android:layout_weight="1" android:layout_width="0dp">
<TextView android:text="TextView" android:id="@+id/Name1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
<TextView android:text="TextView" android:id="@+id/Name2" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
</LinearLayout>
<ImageView android:id="@+id/imageView2" android:src="@drawable/icon" android:layout_height="wrap_content" android:layout_weight="0" android:layout_width="0dp"></ImageView>
</TableRow>
</TableLayout>
ok, i think the problem is here
row = inflater.inflate(R.layout.test , parent, false);
change false to true, i think you have to attach the view to it's parent.
if that doesn't work try this.
row = inflater.inflate(R.layout.test , null);
Abandon ArrayLayout for SimpleAdapter or SimpleCursorAdapter. This will allow you to easily bind your data with simple to fairly complex layouts.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With