ListView 항목이 콘텐츠를 래핑하기 위해 커지지 않는 이유는 무엇입니까?
가변 목록 항목 높이가있는 다소 복잡한 ListView가 있습니다. 특정 조건에서 기본적으로 숨겨진 (View.GONE) 목록 항목에 추가보기를 표시해야합니다. 이를 활성화하면 (View.VISIBLE) 목록 항목의 높이가 커집니다 (또는 적어도 그럴 것입니다).
문제 : 항목의 루트 레이아웃을 wrap_content로 선언하고 항목의 각 구성 요소를 fill_parent로 선언하더라도 항목의 높이를 변경해야하는 숨기기 / 표시 뷰는 부모 대신 하단에서 잘립니다. 항목 레이아웃) 높이가 커져 완전히 표시됩니다.
내가 놓친 ListViews 및 항목 레이아웃 및 항목 높이와 관련된 문제가 있습니까?
더 많은 관찰 :
테스트 목적으로 이제 루트 LinearLayout과 ImageView 만 포함하도록 목록 항목 레이아웃을 줄였습니다. LinearLayout 높이를 예를 들어 200dip으로 설정하고 ImageView를 fill_parent로 설정하면 ImageView가 부모가 설정 한 200dip 제한에 도달 할 때까지 성장할 것으로 예상했을 것입니다.
그러나 이미지는 비트 맵 리소스만큼만 높이가되고 (내가 wrap_content로 설정 한 것처럼) 전체 목록 항목의 높이가 같습니다 (예 : wrap_content로 설정 한 것처럼).
그러나 이미지 높이를 예를 들어 200dip으로 설정하면 목록 항목의 높이가 증가하고 항목 레이아웃도 증가합니다.
즉, 목록 항목 레이아웃의 layout_height는 완전히 무시되며 하드 코딩 된 픽셀 값을 제외한 ImageView의 모든 높이 값도 무시됩니다.
나는 이것을 고칠 수 있었지만 이유를 이해하지 못합니다 .
앞서 언급했듯이 layout_height
목록 항목 레이아웃을로 설정했습니다 wrap_content
( fill_parent
ListView가 무한히 길다는 점을 고려하면 여기서는 의미가 없습니다).
그러나 해당 레이아웃 내부layout_height
의 모든 뷰 를 . 대신에 설정하면 문제가 사라졌습니다 .fill_parent
wrap_content
이것은 다른 두 가지 질문을 제기합니다.
1) fill_parent
부모가 요청하는 뷰의 의미는 무엇입니까 wraps_content
? 어떤 크기 요청이 우선합니까?
2) fill_parent
분명히 작동하지 않는 경우 뷰가 목록 항목을 채우도록하려면 어떻게 해야합니까?
입력 해 주셔서 감사합니다.
이것을 시도하십시오 : http://www.java2s.com/Code/Android/UI/setListViewHeightBasedOnChildren.htm
public class Utils {
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();
}
}
행을 어떻게 팽창시키고 있습니까?
지금 사용하지 않는 경우 LayoutInflater#inflate(layoutId, parent, false)
( 또는에 제공된 위치 parent
)를 사용해보십시오 .AdapterView
getView()
newView()
v = getLayoutInflater().inflate(R.layout.list_item, parent, false);
레이아웃 문제는 ScrollView가 래퍼로 인해 발생할 수 있습니다.
http://developer.android.com/reference/android/widget/ExpandableListView.html 에서 몇 가지 메모를 발견했습니다.
"... 참고 : 부모의 크기도 엄격하게 지정되지 않은 경우 XML에서 ExpandableListView의 android : layout_height 속성에 wrap_content 값을 사용할 수 없습니다 (예를 들어 부모가 ScrollView 인 경우 wrap_content도 지정할 수 있으므로 지정할 수 없습니다. 길이는 제한이 없습니다. 그러나 ExpandableListView 상위 항목이 100 픽셀과 같은 특정 크기 인 경우 wrap_content를 사용할 수 있습니다. "
ScrollView 래핑을 제거하고 선형 레이아웃이 제대로 작동하기 시작했습니다. 이제 ScrollView에 물건을 래핑하는 방법을 이해하는 것뿐입니다. 신이 도와 줘
그러나 어쨌든 이것은 정말 이상한 행동입니다. fill_parent가 실제로 올바른 표현이 아니라고 생각합니다. heirarchyviewer 도구를 사용할 때 항상 layout_width 및 leayout_height에 대한 WRAP_CONTENT 및 MATCH_PARENT 값이 표시됩니다. 그래서 아마도 fill_parent는 실제로 나를인지 부조화에 빠뜨리는 match_parent를 의미합니다.
"AbsListView.LayoutParams"를 사용하여 "Adapter.getView ()"내에서 수동으로 너비와 높이를 구성합니다.
View
크기가 조정되는 목록 항목으로 사용자 정의 를 사용하는 경우 PeBek의 답변에서 가져 와서이를 구성 할 때이를 수행 할 수 있습니다.View
addOnLayoutChangeListener(
new OnLayoutChangeListener() {
@Override
public void onLayoutChange(View _, int __, int ___, int ____, int bottom, int _____, int ______,
int _______, int old_bottom) {
final ListView list_view = (ListView) getParent();
final ViewGroup.LayoutParams params = list_view.getLayoutParams();
params.height += bottom - old_bottom;
list_view.setLayoutParams(params);
list_view.requestLayout();
}
});
When the View
gets resized this callback method will me run and it updates the ListView
height to include the change in height (delta bottom). The other values, if they prove useful for you are view
(reference to the view), left
, top
, right
, bottom
, old_left
, old_top
, old_right
, old_bottom
. It works for expanding and collapsing the view.
API 11 is required for OnLayoutChangeListener
, don't know if there's a backward compatible way to do so.
I had the same problem: i would like to have a list inside my activity that fill all the screen either when the device is in vertical than in horizontal orientation. I solve the problem using al Linear Layout that have height that have to fill_parent, and setting the height of the item in the list to 0dp while the layout_weight is setter to 1.
android:layout_weight="1"
android:layout_height="0dp"
this works for me
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/activity_vertical_margin">
<TextView
android:id="@+id/tv_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="17sp"
android:text="@string/text_list_devices" />
<ListView
android:id="@+id/lv_paired"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/activity_vertical_margin"
android:cacheColorHint="#00000000"
android:layout_above="@+id/signup_t"
android:layout_below="@id/tv_status"
/>
<Button
android:id="@+id/signup_t"
style="?android:textAppearanceSmall"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:textColor="@android:color/white"
android:layout_alignParentBottom="true"
android:text="Print All Records"
android:typeface="sans"
android:layout_marginLeft="45dp"
android:layout_marginRight="45dp"
android:textSize="24sp"
android:background="@drawable/selector_for_button"
android:textStyle="bold" />
</RelativeLayout>
ReferenceURL : https://stackoverflow.com/questions/1661293/why-do-listview-items-not-grow-to-wrap-their-content
'Programing' 카테고리의 다른 글
SOA (서비스 지향 아키텍처) 란 무엇입니까? (0) | 2020.12.29 |
---|---|
Control.BeginInvoke에 대한 MethodInvoker 대 작업 (0) | 2020.12.29 |
CTE 오류 : "앵커와 재귀 부분간에 유형이 일치하지 않습니다." (0) | 2020.12.29 |
스위치 블록 내에서 foreach 루프에서 벗어나기 (0) | 2020.12.29 |
HTTPS URL을 생성하도록 Paperclip을 구성 할 수 있습니까? (0) | 2020.12.29 |