2012-03-01 25 views
6

ListViewで奇妙な動作が見られます。androidのListView行の動的な高さ

私はListViewを持っていますが、これにはいくつかのデータが入っています。各行には画像と3つのテキストラベルが含まれています。テキストフィールドに入るものは何でも、

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:paddingTop="0dip" 
    android:paddingBottom="0dip" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <ImageView android:id="@+id/Icon" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="2" 
     android:padding="2dp" 
     android:scaleType="fitCenter" 
     android:contentDescription="@string/app_icon"/> 

    <TextView android:id="@+id/TxtName" 
     android:scrollHorizontally="false" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:textColor="@android:color/black" 
     android:background="@color/list_bg1" 
     android:layout_weight="2" 
     android:padding="2dp"/> 

    <TextView android:id="@+id/TxtPackage" 
     android:scrollHorizontally="false" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="2" 
     android:textColor="@android:color/black" 
     android:background="@color/list_bg2" 
     android:padding="2dp"/> 

    <TextView android:id="@+id/TxtSource" 
     android:scrollHorizontally="false" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="2" 
     android:background="@color/list_bg3" 
     android:textColor="@android:color/black" 
     android:padding="2dp"/> 
</LinearLayout> 

(数文字80から100文字まで)の任意な長さのものとすることができる:ここでは、行のための私のXMLは、(私はアダプタのgetView方法でそれを膨らませています)ですラップされたラベルの高さに合わせてラベルを折り返して、行の高さを拡大します。

しかし、ラベルは折り返されますが、行の高さは拡大しないため、ラベルの下端が切り取られます。ここに私のgetView方法です:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    SetInfo app = (SetInfo)getItem(position); 
    if(app == null) 
     return null; 

    LinearLayout row = (LinearLayout) (convertView == null 
       ? LayoutInflater.from(context).inflate(R.layout.listitem, parent, false) 
       : convertView); 
    ((TextView)row.findViewById(R.id.TxtName)).setText(app.getName()); 
    ((TextView)row.findViewById(R.id.TxtPackage)).setText(app.getPackage()); 
    ((TextView)row.findViewById(R.id.TxtSource)).setText(app.getSource()); 
    if(app.getIcon() != null) 
     ((ImageView)row.findViewById(R.id.Icon)).setImageDrawable(app.getIcon()); 
    return row; 
} 

がどのように異なる高さであるように行を持つことができ、すべてのコンテンツに合わせて自動的に調整?

+0

より良い方法を使用アンドロイド:行のレイアウトのTextviewでmaxLines = 1それ以上の1行のテキストを防ぐ –

+0

あなたはandroid:layout_weightを1に調整しようとしましたか? –

+0

@Samir:私は正反対にしたい:すべてのテキストを表示する必要があるので、ラベルは折り返さなければならない。 –

答えて

8

android:layout_height = "wrap_content"になるようにTextViewを変更してみてください。

+0

これはほとんど私がしたいことをします。つまり、行の高さがラベルの折り返しを可能にするように拡張されましたが、異なる背景色を別のラベルに設定することで、列の色を適切に設定する能力が失われています。今度は、ラベルがラップするほど色が伸びてしまい、別のラベルがより多くの行にラップすると、色付きラベルの下に白のデフォルトの背景が表示されます。どのようにこれに対処するためのアイデア? –

+0

これは最終的に私がしなければならなかったので、私はこの答えを受け入れるでしょう - そして、私が望むようにレイアウトを得るために、他の苦しい処理の一杯に行きましょう。 –

4

私はsamの問題を抱えていましたが、@ maebeの答えは私にとってはうまくいきませんでした。それを動作させるには、アダプタのgetViewのTextViewでrequestLayout()を呼び出さなければなりませんでした。

だから、あなたのケースでは、あなたがそれぞれのTextViewのためrequestLayout()を呼び出す必要があります:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    // Inflate your view etc. 

    row.findViewById(R.id.TxtName).requestLayout(); 
    row.findViewById(R.id.TxtPackage).requestLayout(); 
    row.findViewById(R.id.TxtSource).requestLayout(); 
    return row; 
} 

私はトリックのすべての種類を試してみました、これは私の場合で働いていた唯一のものです。

+0

+1このハックは+1です。私の一日を作った。ありがとう@muscardinus – niranjan94