6560


レイアウトを動的に追加するコードを書いたのですが､うまく行かず表示されません｡  
以下の`three_grid_row.xml`に`grid_item.xml`を3つ水平に並べたものを複数作成し､ルートビューである`fragment_video_info.xml`のLinearLayoutである`suggestion_video_list`に追加します｡  
実行してみるとエラーは出ないのですが`suggest_video_list`が表示されません｡

**`fragment_video_info.xml`の一部:**

[code]

     <LinearLayout
            android:id="@+id/suggestion_video_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
     </LinearLayout>
    
[/code]

**`three_grid_row.xml`:**

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent" android:layout_height="wrap_content"
        android:orientation="horizontal">
    
    </LinearLayout>
    
[/code]

**`grid_item.xml`:**

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
                <ImageView
                    android:id="@+id/iv_thumbnail"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
                <TextView
                    android:id="@+id/suggest_duration"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="65dp"
                    android:layout_marginRight="4dp"
                    android:background="@drawable/border"
                    android:textColor="#FFFFFF"/>
            </RelativeLayout>
            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
                <TextView
                    android:id="@+id/suggest_video_name"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:ellipsize="end"
                    android:maxLines="2"
                    android:textAppearance="?android:attr/textAppearanceMediumInverse"/>
                <TextView
                    android:id="@+id/suggest_ch_name"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/suggest_video_name"
                    android:textAppearance="?android:attr/textAppearanceSmall"/>
                <TextView
                    android:id="@+id/suggest_video_view"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/suggest_ch_name"
                    android:textAppearance="?android:attr/textAppearanceSmall"/>
            </RelativeLayout>
    
        </LinearLayout>
    </FrameLayout>
    
[/code]

**処理部:**

[code]

    if (!relatedVideoList.isEmpty()) {
                //layoutInflaterを取得
                LayoutInflater inflater = (LayoutInflater) getActivity().getApplicationContext()
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
                //LinearLayoutを入れる配列を作る
                LinearLayout[] gridRowList = new LinearLayout[7];
                for (int i = 0; i < 3; i++) {
                    gridRowList[i] = (LinearLayout) inflater.inflate(R.layout.three_grid_row, null);
                }
                for (int i = 3; i < 7; i++) {
                    gridRowList[i] = (LinearLayout) inflater.inflate(R.layout.three_grid_row, null);
                    gridRowList[i].setVisibility(View.GONE);
                }
    
                //LinearLayoutに追加
                int count = 0;
                for (VideoItems item : relatedVideoList) {
                    FrameLayout gridItem = null;
                    if (count < 3) {
                        gridItem = (FrameLayout) inflater.inflate(R.layout.grid_item, gridRowList[0], false);
                    } else if (count >= 3 && count < 6) {
                        gridItem = (FrameLayout) inflater.inflate(R.layout.grid_item, gridRowList[1], false);
                    } else if (count >= 6 && count < 9) {
                        gridItem = (FrameLayout) inflater.inflate(R.layout.grid_item, gridRowList[2], false);
                    } else if (count >= 9 && count < 12) {
                        gridItem = (FrameLayout) inflater.inflate(R.layout.grid_item, gridRowList[3], false);
                    } else if (count >= 12 && count < 15) {
                        gridItem = (FrameLayout) inflater.inflate(R.layout.grid_item, gridRowList[4], false);
                    } else if (count >= 15 && count < 18) {
                        gridItem = (FrameLayout) inflater.inflate(R.layout.grid_item, gridRowList[5], false);
                    } else if (count >= 18 && count < 21) {
                        gridItem = (FrameLayout) inflater.inflate(R.layout.grid_item, gridRowList[6], false);
                    }
    
                    //Viewをセット
                    if (gridItem != null) {
                        SuggestViewHolder holder = new SuggestViewHolder();
                        setGridItemView(gridItem, holder);
                        setGridItemContents(holder, item);
                    }
                    count++;
                }
    
                //LinearLayoutにViewをセット
                LinearLayout suggestVideoContainer = (LinearLayout) view.findViewById(R.id.suggestion_video_list);
                for (LinearLayout item : gridRowList) {
                    suggestVideoContainer.addView(item);
                }
    
                //関連動画を出すボタンの有無をセットする
                if (gridRowList.length < 4 ) {
                    LinearLayout suggestButton = (LinearLayout)view.findViewById(R.id.suggest_exp_button);
                    suggestButton.setVisibility(View.GONE);
                }
            }
    
[/code]

**`setGridItemView`:**

[code]

     private void setGridItemView(FrameLayout gridItem, SuggestViewHolder holder){
        holder.suggestThumbnail = (ImageView)gridItem.findViewById(R.id.iv_thumbnail);
        holder.suggestDuration = (TextView)gridItem.findViewById(R.id.suggest_duration);
        holder.suggestVideoName = (TextView)gridItem.findViewById(R.id.suggest_video_name);
        holder.suggestChannelName = (TextView)gridItem.findViewById(R.id.suggest_ch_name);
        holder.suggestViewCount = (TextView)gridItem.findViewById(R.id.suggest_video_view);
    }
    
[/code]

**`setGridItemContents`:**

[code]

    private void setGridItemContents(SuggestViewHolder holder, VideoItems videoItems){
        Picasso.with(getActivity()).load(videoItems.snippet.thumbnails.default1.url).into(holder.suggestThumbnail);
        holder.suggestChannelName.setText(videoItems.snippet.channelTitle);
        holder.suggestDuration.setText(durationConverter(videoItems.contentDetails.duration));
        holder.suggestVideoName.setText(videoItems.snippet.title);
        holder.suggestViewCount.setText(numberConverter(videoItems.statistics.viewCount, 0) + " " + getString(R.string.views));
    }
    
[/code]

なにか､間違えているところがありましたら教えて下さい｡よろしくお願いします｡


CC BY-SA 3.0
2015-02-16T06:38:18.153
6555
2015-02-22T08:05:24.337
7232
question
android android-layout
レイアウトを動的に追加したい｡


viewの宣言位置の記述がないので何とも言えませんがinvalidate()で再描画したらどうでしょうか？


CC BY-SA 3.0
2015-02-16T07:26:52.630
6557
2015-02-16T07:26:52.630
8314
6555
answer

[code]

    gridItem = (FrameLayout) inflater.inflate(R.layout.grid_item, null); 
    gridRowList[0].addView(gridItem);  
    
[/code]

こんな感じの処理にしてもダメですか？


CC BY-SA 3.0
2015-02-16T07:50:08.093
6560
2015-02-16T07:57:08.097
2015-02-16T07:57:08.097
3516
8314
6555
answer


LayoutInflater#inflate()に第2引数を指定、第3引数をtrueにする。

[code]

    LayoutInflater inflater = LayoutInflater.from(context);
    
    for (int i = 0; i < n; i++) {
      inflater.inflate(R.layout.foo, parent, true);
      // 追加したViewを取得
      View view = parent.getChildView(i);
    }
    
[/code]

# 追記

[code]

    ViewGroup container = (ViewGroup) findViewById(R.id.suggestion_video_list);
    fot (int i = 0; i < listSize; i++) {
      inflater.inflate(R.layout.three_grid_row, container, true);
      ViewGroup rowContainer = (ViewGroup) relatedVideoList.getChildAt(i);
      for (int j = 0; j < 3; j++) {
        inflater.inflate(R.layout.grid_item, rowContainer, true);
        ViewGroup gridItemView = (ViewGroup) rowContainer.getChildAt(j);
    
        ImageView thumb = (ImageView) gridItemView.findViewById(R.id.iv_thumbnail);
        // do something
        TextView duration = (TextView) gridItemView.findViewById(R.id.suggest_duration);
        // do something
      }
    }
    
[/code]


CC BY-SA 3.0
2015-02-16T10:04:52.583
6573
2015-02-17T01:10:47.857
2015-02-17T01:10:47.857
4739
4739
6555
answer


この手のレイアウトがうまくいかないときの調べ方のコツを書いておきます。

いくつかあるのですが、まずはいろいろな View/ViewGroup に対して  
android:background="#f00" の様な感じで色をつけていって、  
今見えているのがどの View になっているのかを確認していくのがお手軽です。  
ハマった時はこの方法で、意図どおりのレイアウトになっているかを一歩ずつ  
確認していくといいです。


CC BY-SA 3.0
2015-02-17T17:09:37.513
6648
2015-02-17T17:09:37.513
319
6555
answer


gridItemというビューをどこにも追加していないので、表示されていません。

[code]

    gridRowList[番号].addView(gridItem);
    
[/code]

というコードを入れることで表示されるようになると思います。

* * *

inflateメソッドが追加していると思っているのかもしれませんが、最後の引数がfalseだと追加されません。  
trueであれば追加されますが、2つ目の引数がnullでなければそれを返すようになるので、その場合生成されたビューをgetChildAtなど別の方法を使って取得する必要があります。


CC BY-SA 3.0
2015-02-22T07:19:58.213
6912
2015-02-22T08:05:24.337
2015-02-22T08:05:24.337
8472
8472
6555
answer