2011-01-25 27 views
4

私は、データベースにクエリを実行してレコードセットを取得するアプリケーションを持っていますが、ディスプレイ上でこれらのデータを複雑なレイアウトの行で表示する必要があります。各行にはいくつかのImageView、多くのTextViewなどが含まれています。レコードごとに複雑なレイアウトを繰り返します。

プログラムから行レイアウトを作成するのは本当に難しいですが、行レイアウト全体(コンテナと行レイアウトの子要素)をXMLから取得する方法はありますかいくつかのプロパティ(行レイアウトのTextViewsなど)を追加し、その結果をLinearLayoutに追加しますか?

答えて

10

は、どのような方法がありますあなたが探しているものをXML

から行全体のレイアウト(行レイアウトのコンテナとチャイルズ)を取得すると、ビューをinflateする方法である(LayoutInflator

適切な用語があるので、例を見つけるのは簡単で、ListViewのチュートリアルではinflateが一般的です。例えば、例えば、このチュートリアルでgetView()で見てみましょう:

HOWTO:リストビュー、アダプタ、getViewメソッドと別のリスト項目のレイアウトを1つのListViewコントロールに
http://android.amberfog.com/?p=296

mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
... 
convertView = mInflater.inflate(R.layout.item1, null); 

...いくつかのプロパティを編集します(行レイアウトのTextViewsなど)。

ビューを展開すると、その中のウィジェットを検索して操作することができます。

holder.textView =(TextView)convertView.findViewById(R.id.text);

// Data structure to save lookups 
public static class ViewHolder { 
    public TextView textView; 
} 
... 
// Save lookups to widgets for this view in ViewHolder in tag 
ViewHolder holder = new ViewHolder(); 
holder.textView = (TextView) convertView.findViewById(R.id.text); 
view.setTag(holder); 
... 
// Grab saved widgets - no need to search tree for them via lookup again 
ViewHolder holder = (ViewHolder) convertView.getTag(); 
holder.textView.setText(mData.get(position)); 
:参照例では、関連ビットの下に示さ

ビューはかなり複雑であり、および/またはあなたは、多くの場合、その中のウィジェットを探している場合は、私はViewHolder技術を指摘したいです、


...結果をLinearLayoutに追加しますか?おそらく

、すでにプログラム的LinearLayoutに追加しているが、あなたはいくつかのコードを見たい場合は、ここでいくつかのレイアウトパラメータの設定を示す例です:

アンドロイドのLinearLayout
http://developerlife.com/tutorials/?p=312

// main "enclosing" linearlayout container - mainPanel 
    final LinearLayout mainPanel = new LinearLayout(ctx); 
    { 
    mainPanel.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
               LayoutParams.FILL_PARENT)); 
    mainPanel.setOrientation(LinearLayout.VERTICAL); 
    ... 
    } 
    ... 
    // top panel 
    LinearLayout topPanel = new LinearLayout(ctx); 
    { 
    // WEIGHT = 1f, GRAVITY = center 
    topPanel.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
               LayoutParams.WRAP_CONTENT, 
               1)); 
    ... 
    } 
    ... 
    // bottom panel 
    LinearLayout bottomPanel = new LinearLayout(ctx); 
    { 
    LayoutUtils.Layout.WidthFill_HeightWrap.applyLinearLayoutParams(bottomPanel); 
    ... 
    } 
    ...  
    // add the panels 
    mainPanel.addView(topPanel); 
    mainPanel.addView(bottomPanel); 
    ... 

最後に、AdapterView/で多くのことができます(カスタム行を含む)。パラダイム、例えば。 ListViewSimpleCursorAdapterを使用してください。それはそれを調べることによっていくつかのコードを保存するかもしれません。いくつかここでそれについてbabbling:

Android ListView with different layouts for each row

4

コードを使用してViewのインスタンスを作成するときは、必ず2回考えます。

リソースからレイアウトを作成する方法については、LayoutInflaterを参照してください。特殊なケースでは、ListViewに複数の行を表示する場合は、ResourceCursorAdapterをチェックすることもできます。

0

どのような種類のテーブルを使用していますか?あなたのレイアウトはこのようなものになるだろう場合:

<TableLayout> 
    <LinearLayout android:id="@+id/linearLayoutTest"> 
    <TextView/> 
    <TextView .... 
    <ImageView .... 
    </LinearLayout> 
    <LinearLayout .... 
</TableLayout> 

IDを通じて行コンテナにアクセスして、位置によって望ましい子を見つけるのは簡単だろう:

LinearLayout linearLayout = (LinearLayout)this.findViewById(R.id.linearLayoutTest); 
TextView textView = (TextView)linearLayout.getChildAt(0); 
textView.setText("New Text");