2011-10-19 9 views
3

私はカスタムArrayAdapterを使用してビジネスオブジェクトの配列にバインドしようとしているListActivityを持っています。ArrayAdapter - 何が間違っていますか?

エミュレータまたは実際のアンドロイドデバイスでアプリケーションを実行すると、ArrayAdapterの "holder.txtTeam1.setText(info.Team1);"行でnull参照が取得されます。いくつかのデバッグを行った後、レイアウトを膨張させる呼び出しが実際に子のTextViewsを作成しなかったように見えるだけで、それはOuter TableLayoutを作成しただけです。

これはすべて私がインターネット上で見つけたチュートリアルに基づいており、私はこの1週間で頭を机の上から叩いていました。誰かが私が間違っていることを教えてもらえますか?

活動は次のようになります。

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); 
     } 
    } 

ArrayAdapterは次のようになります。

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; 
} 

} 

そして、リストの活動項目のレイアウトは、次のようになります。

<?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> 
+0

Yashwanth Kumarは答えにクレジットを得て、Dan Sは私にもっと簡単な解を与えて私に知らなかったことを示すためにupvoteを得ます。皆さん、ありがとうございました。 –

答えて

2

[OK]を、私は問題がtrueにfalseを変更

row = inflater.inflate(R.layout.test , parent, false); 

ここ

だと思う、私はあなたがその親へのビューを添付しなければならないと思います。

これがうまくいかない場合は、これを試してください。

+0

第2のオプションが働いた –

1

放棄ArrayLayoutはSimpleAdapterまたはSimpleCursorAdapterです。これにより、簡単で複雑なレイアウトで簡単にデータをバインドすることができます。

+0

これは私が前にやってみたものですが、SimpleAdapterはビジネスオブジェクトの1つのプロパティをレイアウト内の1つのビューにバインドすることしかできませんでした。これが完全に機能するときは、実際にはLayoutItemの5つのビューをビジネスオブジェクトの異なるフィールドにバインドする必要があります。これを反映するように質問を更新します。 –

+0

コンストラクタで 'from'および' to'パラメータを使用すると、任意の数のデータ項目をビューにバインドできます。 –

関連する問題