web-dev-qa-db-ja.com

Androidでリストビューの高さを制限する

ListViewの下にボタンを表示したい。問題は、ListViewが拡張される(アイテムが追加される...)と、ボタンが画面から押し出されることです。

重みでLinearLayoutを試しました( Android:ビューにmaxHeightがないのはなぜですか? )。ただし、重みが間違っているか、単に機能しませんでした。

また、RelativeLayoutを使用するヒントをどこかで見つけました。 ListViewは、ボタンの上にAndroid:layout_aboveパラメータで設定されます。

これの問題は、後でボタンを配置する方法がわからないことです。私が見つけた例では、ListViewの下のビューはAndroid:layout_alignParentBottomを使用して調整されましたが、ボタンが画面の下部にくっついて欲しくありません。

SetHeight-methodと必要なスペースの計算を使用する以外のアイデアはありますか?


編集:私は多くの有用な答えを得ました。

  • bigstoneとuser639183のソリューションalmostは完全に機能しました。ただし、ボタンの下部に余分なパディング/マージンを追加する必要がありました。これはまだ画面から半分押し出されたままになるためです(その後停止しました)

  • 画面の下部にボタンを固定する場合にのみ、相対的なレイアウトに関するAdiniaの答えは問題ありません。それは私が意図したものではありませんが、他の人にとってはまだ役に立つかもしれません。

  • AngeloSのソリューションは、私が望んでいたエフェクトを作成したため、最後に選んだものでした。ただし、ボタンの周りのLinearLayoutに2つの小さな変更を加えました。

    • まず、レイアウトに絶対値を入れたくないので、Android:layout_height="45px"wrap_contentに変更しました。

    • 次に、ボタンを水平方向の中央に配置する必要があったため、垂直LinearLayoutでのみサポートされていたため、Android:orientation = "horizo​​ntal"を "vertical"に変更しました。

    AngeloSはまた、最初の投稿で、LinearLayoutの周りのListView内のAndroid:layout_weight="0.1"パラメーターが効果があるかどうかわからないと述べました。私はちょうど試してみましたが、実際にそうです!なしでは、ボタンは再び画面から押し出されます。

88
jellyfish

私はこの正確な問題を抱えていたので、それを解決するためにLinearLayoutsListViewをそれぞれ格納する2つの別個のButtonを作成しました。そこから両方を別のLinear Layoutに入れ、そのコンテナのAndroid:orientationverticalに設定します。また、LinearLayoutを格納したListViewの重みを0.1に設定しましたが、それが効果があるかどうかはわかりません。そこから、下のコンテナ(ボタンがある)の高さを好きな高さに設定できます。

[〜#〜] edit [〜#〜]これは私が意味するものです:

<LinearLayout
  xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:layout_width="fill_parent"
  Android:layout_height="fill_parent"
  Android:orientation="vertical">

  <LinearLayout
        Android:orientation="horizontal"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="0.1"
        >   



                  <ListView Android:id="@+id/ListView01" 
                    Android:layout_height="fill_parent"
                    Android:layout_width="fill_parent"
                    Android:dividerHeight="2px">
                 </ListView>



    </LinearLayout> 

<LinearLayout
    Android:orientation="horizontal"
    Android:layout_width="fill_parent"
    Android:layout_height="45px"
    Android:background="@drawable/drawable" 
    > 


                <Button Android:background="@drawable/btn_more2"                     
                     Android:id="@+id/moreButton"
                     Android:layout_width="wrap_content"
                     Android:layout_height="fill_parent"
                     Android:layout_alignParentRight="true"
                     Android:paddingRight="20px"
                     />

</LinearLayout>
</LinearLayout>

上記の解決策は、画面の下部にあるボタンを修正します。


リストの下部でボタンをフロートさせるには、ListView01の高さをwrap_contentに変更します。

<LinearLayout
  xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:layout_width="fill_parent"
  Android:layout_height="wrap_content"
  Android:orientation="vertical">

  <LinearLayout
        Android:orientation="horizontal"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="0.1"
        >   

        <ListView Android:id="@+id/ListView01" 
                    Android:layout_height="wrap_content"
                    Android:layout_width="fill_parent"
                    Android:dividerHeight="2px">
                 </ListView>



    </LinearLayout> 

<LinearLayout
    Android:orientation="horizontal"
    Android:layout_width="fill_parent"
    Android:layout_height="45px"
    Android:background="@drawable/drawable" 
    > 


                <Button Android:background="@drawable/btn_more2"                     
                     Android:id="@+id/moreButton"
                     Android:layout_width="wrap_content"
                     Android:layout_height="fill_parent"
                     Android:layout_alignParentRight="true"
                     Android:paddingRight="20px"
                     />

</LinearLayout>
</LinearLayout>
52
AngeloS

この問題をコードで解決し、リストビューの高さを5つ以上のアイテムがある場合にのみ設定しました。

if(adapter.getCount() > 5){
        View item = adapter.getView(0, null, listView);
        item.measure(0, 0);         
        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, (int) (5.5 * item.getMeasuredHeight()));
        listView.setLayoutParams(params);
}

最大の高さを単一のアイテムの高さの5.5倍に設定していることに注意してください。これにより、ユーザーはスクロールを行う必要があることが確実にわかります。 :)

62
shaylh

最後の編集では、Android:layout_above="@+id/butt1"をListViewコードで。

そして、あなた(そして以前に答えを試した人全員)にあなたが本当に複数のRelativeLayoutを使う必要がないことを示すために、ここに修正されたコード

   <RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:background="@drawable/bkg">
    <TextView
        Android:id="@+id/textView1"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:text="TextView1"
        Android:layout_alignParentTop="true">
    </TextView>
    <TextView
        Android:id="@+id/textView2"
        Android:layout_below="@+id/textView1"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:text="TextView2"
        Android:layout_centerHorizontal="true">
    </TextView>
    <Button
        Android:id="@+id/butt1"
        Android:text="string/string3"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerHorizontal="true"
        Android:layout_alignParentBottom="true">
    </Button>
    <ListView
        Android:id="@+id/Android:list"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="2dip"
        Android:layout_marginBottom="2dip"
        Android:drawSelectorOnTop="false"
        Android:visibility="visible"
        Android:layout_below="@+id/textView2"
        Android:layout_above="@+id/butt1" />
    </RelativeLayout>

および結果、ランダムリストを使用:
enter image description here

21
Adinia

LinearLayoutを使用して、ListViewButtonの高さをwrap_contentに設定し、ListViewにweight = 1を追加します。これはあなたが望むように動作するはずです。
そして、はい、Buttonlayout_gravitybottomに設定します

6
ernazm

RelativeLayoutは解決策です。ボタンを最下部に近づけたくない場合は、マージンを追加できます(ボタンをパディングすると、9パッチの背景を使用し、独自のボタンを設定するため、ボタンが壊れます)パディング)。

LinearLayoutを使用した場合も同じになります。目的を達成する方法は、ListViewをheight = 0およびweight = 1に設定し、ボタンのheight = wrap_contentに設定することですおよびweight = 0。 (user639183が述べたように、両方をwrap_contentに設定しても、ListViewの高さは制限されません)。

5
bigstones

AngeloSのソリューションに触発され、ネストされたコンテナを使用せずにこれを行う方法を見つけました。

LinearLayoutとボタンがある、垂直方向のListViewを使用しました。 Android:layout_weight="0.1"ListViewを表します。

常にボタンをリストの一番下に貼り付けることができます。また、リストが大きくなっても、ボタンは画面から押し出されません。

<ListView
    Android:id="@+id/notes_list"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_weight="0.1"        
    />

<Button
    Android:id="@+id/create_note_btn"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"        
    Android:onClick="onCreateButtonClicked"
    Android:text="@string/create_notes"
    />
5
Sparkle

これが最もクリーンな方法です:

<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical">
  <ListView
      Android:id="@+id/ListView01"
      Android:layout_width="fill_parent"
      Android:layout_height="0dp"
      Android:layout_weight="1"
      Android:dividerHeight="2px">
  </ListView>
  <FrameLayout
      Android:layout_width="fill_parent"
      Android:layout_height="wrap_content"
      Android:background="@drawable/drawable"
      >
    <Button Android:background="@drawable/btn_more2"
        Android:id="@+id/moreButton"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentRight="true"
        Android:paddingRight="20px"
        />    
  </LinearLayout>
</LinearLayout>

Angelosのソリューションに似ていますが、ListViewをラップするlinearlayoutは必要ありません。また、LinearLayoutよりも軽いFrameLayoutを使用して、Buttonをラップできます。

2
user2994360

ネストされたコンテナを使用して、おそらくこれを機能させることができます。 Buttonを2番目の(内部)コンテナーにラップして、より多くのスペースを取り、Buttonを内部コンテナーの上部に揃える必要がある場合があります。

このような可能性のあるもの:

RelativeLayout

- リストビュー

-RelativeLayout

----ボタン

2つのコンテナで異なる配置オプションを使用すると、これを機能させることができます。

2
Rich

このアイデアは、非常に優れたソリューションで次のように概説されています。

両方とも、少なくともv4.4.3では完全に動作するようです。

私はまだテストコードを書いてそれをチェックアウトし、各メソッドを確認するのにいくらかの時間を費やす必要がありました。以下は、必要最小限の自己完結型のテストコードです。


レイアウトは、ネストされたレイアウトが少ないため、Sparkleのソリューションに基づいています。また、現在のLINTチェックを反映するように更新されました。

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical"
    tools:context="MainActivity" >

    <ListView
        Android:id="@+id/listview"
        Android:layout_width="fill_parent"
        Android:layout_height="0dp"
        Android:layout_weight="1" />

    <Button
        Android:id="@+id/btn"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:text="Grow List"
        tools:ignore="HardcodedText" />

</LinearLayout>

アクティビティは、自分でソリューションをテストするための定型コードを提供します。

public class MainActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ListView listview = (ListView)findViewById(R.id.listview);
        final ArrayAdapter<String> adapter = 
                new ArrayAdapter<String>(this,
                                         Android.R.layout.simple_list_item_1,
                                         new ArrayList<String>());
        adapter.setNotifyOnChange(true);
        listview.setAdapter(adapter);

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                int count = adapter.getCount();
                adapter.add(String.valueOf(count));
                listview.setSelection(count);
            }
        });
    }
}

これは「コミュニティwiki」であるため、自由に追加または改善してください。

2

下部にあるボタンでRelativeLayoutを使用してみてください。レイアウトの高さを「wrap_content」として設定します。試したことがありません。ただのアイデア

1
Maxim

linearLayoutで、ListViewにAndroid:layout_weight="1"を追加するだけです

1
DawnYu

以下は私のために働いたものです...

 if(adapter.getCount() > 3){
                    View item = adapter.getView(0, null, impDateListView);
                    item.measure(0, 0);         
                    LayoutParams params = impDateListView.getLayoutParams();
                    params.width = LayoutParams.MATCH_PARENT;
                    params.height = 3 * item.getMeasuredHeight();
                    impDateListView.setLayoutParams(params);


                }

注:params.width = ...も設定する必要があります...

上記の例は、TableRowおよびListViewをTableRow内で使用する場合です...

コンテンツを線形レイアウトでラップする

リストビューで追加:Android:layout_weight = "1"

ボタンセットの固定高さ

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
              Android:layout_width="match_parent"
              Android:layout_height="wrap_content"
              Android:orientation="vertical">

<ListView
    Android:id="@+id/my_list"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_weight="1">
</ListView>

 <Button
    Android:text="Button"
    Android:layout_width="match_parent"
    Android:layout_height="50dp"/>

</LinearLayout>
0
Toma

要素がリストに追加されるときにリストビューの下のコンテンツを下に移動する場合は、次の解決策を試してください。

リストビューの下部に正のパディングを追加し、「フッター」の上部に負のパディングを追加します。これは、線形レイアウトまたは相対レイアウトで機能します。

<ListView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:paddingBottom="50dp"/>

<TextView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginTop="-50dp"/>
0