9

少し問題があります。リスト内のすべてのアイテムの高さが固定されたAndroidリストビューアクティビティを作成したいと思います。

したがって、私のアイテムレイアウト(thread_item.xml)は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="300dip"
        >
    <TextView android:id="@+id/thread_item_title"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="[dummy]"
              android:textSize="20dip"
              android:textStyle="bold"
            />
    <ImageView android:id="@+id/thread_first_image"
               android:layout_below="@id/thread_item_title"
               android:scaleType="centerInside"
               android:maxWidth="100dip"
               android:maxHeight="100dip"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:adjustViewBounds="true" />
    <TextView
            android:id="@+id/thread_item_preview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@id/thread_first_image"
            android:text="[dummy]"
            android:textSize="15dip">
    </TextView>
</RelativeLayout>

ルート要素のlayout_heightを300dipに設定し、すべてのアイテムが同じ高さになることを期待していますが、そうではありません。アプリケーションを実行すると、高さがwrap_content値を持っているように見えます。

さらに、アクティビティ自体は次のようになります。

public class ThreadListActivity extends ListActivity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
        /*
         Code to get items from the storage.
        */

        setListAdapter(new ThreadItemAdapter(this, R.layout.thread_item, itemsArray)));


        getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                /*Start new Activity. Unrelated stuff.*/
            }
        });
    }
}

そして、私が使用しているアダプターは次のようになります。

public class ThreadItemAdapter extends ArrayAdapter<ThreadItem> {

    Activity context;
    List<ThreadItem> items;

    public ThreadItemAdapter(Activity context, int textViewResourceId, List<ThreadItem> items) {
        super(context, textViewResourceId, items);
        this.context = context;
        this.items = items;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inf = this.context.getLayoutInflater();
        View result;
        if (convertView == null) {
            result = inf.inflate(R.layout.thread_item, null);
        } else {
            result = convertView;
        }

        TextView tbTitle = (TextView) result.findViewById(R.id.thread_item_title);
        TextView tbPreview = (TextView) result.findViewById(R.id.thread_item_preview);
        ImageView ivFirstImage = (ImageView) result.findViewById(R.id.thread_first_image);

        ThreadItem item = items.get(position);

        tbTitle.setText(item.getThreadTitle());
        ivFirstImage.setImageBitmap(item.getFirstImage());

        SimpleLeadingMarginSpan span = new SimpleLeadingMarginSpan(item.getFirstImage() != null ? 5 : 0, 115); // TODO: const
        SpannableString previewText = new SpannableString(item.getThreadPreview());
        previewText.setSpan(span, 0, previewText.length(), 0);
        tbPreview.setText(previewText);

        return result;
    }
}

すべてのリストアイテムがまだコンテンツをラップしていて、高さが300dipにとどまらない理由がわかりません。それらは300dipよりも小さいか大きい可能性があります。私はAndroid2.3.3を使用しており、HTC Evo 3Dデバイスとエミュレーターでテストしています(どちらも同じ結果を示しています)。

よろしくお願いします。

UPD:

ミゲルとサムに感謝します。解決策は、maxHeightをtextViewに設定することです。これにより、リストアイテムが大きくなり(つまり+id/thread_item_preview)、RelativeLayoutのminHeightも300dipに設定して、縮小しないようにします。

4

7 に答える 7

41

ただではなく、convertViewのために膨らませるとき

result = inf.inflate(R.layout.thread_item, null);

行う

result = inf.inflate(R.layout.thread_item, parent, false);

問題のメソッドはinflater.inflate(int viewId, ViewGroup parent, boolean attachToRoot)-提供されparentたもの(この場合はListView)を尊重していないため、リストビューアイテムに提供するディメンションは、デフォルトでlayout_width = fill_parent、layout_height = wrap_contentに設定され、300dipは無視されます。 xmlで指定した高さ。親ビューを提供して通過することによりfalse、インフレータはルート(親)にアタッチせずに、300dipの高さを尊重します。

于 2012-04-30T17:50:59.273 に答える
31

行のすべての子ビューの高さをからに変更するとどうwrap_contentなりますmatch_parentか?


コメントから

minHeightおよびmaxHeight属性を試しましたか?例えば:

android:minHeight="300dp"

また、AndroidのRomainGuyがアダプターとの効率について話し合うgetView()のを見る必要があります。

于 2012-04-30T17:30:36.140 に答える
7

これを変更してみてください

android:layout_height="300dip"

android:minHeight="300dip"

これはExpandableListViewを使用して私にとってはうまくいったので、この場合にはうまくいくと思います。

于 2012-04-30T17:51:03.347 に答える
2

これは、最小と最大に同じディメンションを指定することで実現できます。これで私の問題は解決しました。

<ImageView
    android:id="@+id/appIconImageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginBottom="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginTop="8dp"
    android:adjustViewBounds="true"
    android:maxHeight="50dp"
    android:maxWidth="50dp"
    android:minHeight="50dp"
    android:minWidth="50dp"
    android:src="@drawable/ic_launcher" />

ここに画像の説明を入力してください

于 2014-08-10T17:26:08.863 に答える
0

コンテンツのTextViewの高さを0dpに設定してlayout_alignParentBottomから、に設定してみてくださいtrue

于 2012-04-30T17:46:32.113 に答える
0
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:minHeight="60dp"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:gravity="center"
    android:weightSum="1"
    android:background="@color/main_color">

    <ImageView
        android:id="@+id/img_left_menu"
        android:layout_weight="0.4"
        android:focusable="false"
        android:maxHeight="50dp"
        android:maxWidth="50dp"
        android:minHeight="50dp"
        android:minWidth="50dp"
        android:layout_width="0dp"
        android:scaleType="centerInside"
        android:adjustViewBounds="true"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/tx_left_menu"
        android:layout_width="0dp"
        android:textSize="18dp"
        android:layout_gravity="center_vertical"
        android:layout_weight="0.6"
        android:singleLine="true"
        android:layout_height="wrap_content"
        android:focusable="false"
        />
</LinearLayout>
于 2015-03-24T17:51:44.000 に答える
0

私が間違っていない場合、listViewはカスタムビューのLayoutParamsをwrap_content、wrap_contentに自動的に変更します。ただし、上記の答えは正しいです。minHeightまたはminWidthを設定すると、見事に機能します。

于 2015-07-09T12:24:50.903 に答える