ScrollView 内に ListView を埋め込むときに問題が発生しました。または、少なくともそれが問題の原因だと思います。ListView 要素はかなり単純なものです。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/general_background_list_middle"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:paddingRight="0dp"
android:paddingLeft="0dp">
<ImageView
android:id="@+id/chat_friends_avatar"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_marginLeft="7dp"
android:layout_marginRight="8dp"
android:paddingRight="0dp"
android:paddingLeft="0dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:src="@drawable/friends_icon_avatar_default"/>
<TextView
android:id="@+id/chat_message_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/chat_friends_avatar"
android:layout_alignParentTop="true"
android:layout_marginRight="35dp"
android:maxLines="10"
android:textSize="12dp"/>
<TextView
android:id="@+id/chat_friend_name"
android:layout_width="140dp"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
style="@style/SubText"
android:layout_toRightOf="@id/chat_friends_avatar"
android:layout_below="@id/chat_message_text" />
<TextView
android:id="@+id/chat_message_time"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:layout_marginTop="3dp"
style="@style/SubText"
android:layout_alignParentRight="true"
android:layout_below="@id/chat_message_text" />
</RelativeLayout>
ただし、そのような要素のリストを ScrollView に埋め込むと、他の要素の間に行が完全に表示されず、テキストが折り返されている場合に行が切り取られます (下の画像を参照)。ListView は、ScrollView で次のようにインスタンス化されます。
<ListView
android:id="@+id/info_chat_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:cacheColorHint="@color/frame_background_color"
android:clickable="false"
android:divider="@null"
android:footerDividersEnabled="false"
android:focusable="false" >
</ListView>
ListView の高さが「wrap_content」に設定されている場合、最初の要素のみが表示されます。そのため、リストの行の高さを計算するメソッドを使用しています。
private int getCommentsListHeight() {
if (mChatAdapter != null && mChatAdapter.getCount() != 0) {
if (mChatList != null) {// && mCommentsListItemHeight == 0) {
mCommentsListItemHeight = 0;
for (int i = 0; i < mChatAdapter.getCount(); i++) {
// Get view item height
View viewItem = mChatAdapter
.getView(i, new View(OnAirActivity.this), mChatList);
viewItem.measure(0, 0);
Logger.d(LOGTAG, "View " + i + " measured height = " + viewItem.getMeasuredHeight());
mCommentsListItemHeight += viewItem.getMeasuredHeight();
}
}
//return mChatAdapter.getCount() * mCommentsListItemHeight;
return mCommentsListItemHeight;
} else {
return 0;
}
}
残念ながら、TextView 内のテキストが複数の行にわたって折り返されている場合でも、getMeasuredHeight() メソッドによって返される行要素の高さは一定です。また、行要素内の TextView で呼び出される getLineCount() は、テキストが折り返されていても 1 を返します。
一方、この ListView が LinearLayout に埋め込まれている場合、すべてが正常に機能し、完全なリストがクリッピングなしで表示されます。
ここで何が間違っている可能性があるかについて何か提案はありますか? リスト要素の高さを手動で測定するという考えは本当に好きではありませんが、明らかにうまくいきませんが、なぜアンドロイドは ScrollView 内の ListView をうまく引き伸ばしてすべてをそこに収めることができないのですか?
クリップされたリスト: