ListView에서 바닥 글보기를 숨기시겠습니까?


78

나는 ListView. 그 뒤에있는 데이터는 사용자가 맨 아래까지 스크롤 할 때마다 10 ~ 30 개의 항목 집합으로 인터넷에서 가져옵니다. 더 많은 항목을로드하고 있음을 나타 내기 위해 addFooterView()"로드 중 ..."메시지와 스피너를 표시하는 간단한보기를 추가했습니다. 이제 데이터가 부족할 때 (더 이상 가져올 데이터가 없음) 해당 메시지를 숨기고 싶습니다. 나는 시도했다 :

loadingView.setVisibility(View.GONE);

안타깝게도 뷰가 숨겨 지지만 공간이 남습니다. 즉, "Loading"메시지가 있던 곳에 큰 공백이 생깁니다. 이 뷰를 제대로 숨기려면 어떻게해야합니까?

removeFooterView()다시 표시해야 할 수 있으므로 사용할 수 없습니다 .이 경우 addFooterView()어댑터가에 이미 설정되어있어 다시 전화를 ListView걸 수 없으며 어댑터를 설정 한 후에 addHeaderView()/ addFooterView()를 호출 할 수 없습니다 .

답변:


84

적어도 한 번 전에 해당 메서드 중 하나를 호출하는 한 addHeaderView()/ addFooterView() 후에 호출 할 수있는 것 같습니다 . 그것은 구글의 디자인 결정이 다소 좋지 않아서 문제를 제기했습니다 . 이것을 결합하면 내 솔루션이 있습니다.setAdapter()removeFooterView()

내가 얻은 다른 두 답변에 +1, 그들은 유효한 (그리고 틀림없이 더 정확한) 솔루션입니다. 그러나 내 것이 가장 단순하고 단순함을 좋아하므로 내 답변을 수락 된 것으로 표시하겠습니다.


6
이것은 헤더에서 작동하지 않는 것 같습니다. setAdapter 뒤에 바닥 글을 추가 할 수 있지만 머리글은 추가 할 수 없습니다.
cottonBallPaws 2010-12-14

1
엄청난 두통을 구하기 위해 +1. 어댑터를 설정하기 전에 바닥 글을 추가해야하는지 알아내는 데 얼마나 걸렸을 지 궁금합니다. (벙어리)
Ross Hambrick

스크롤 위치는 하단을 제거하면 재설정되므로 오버 스크롤을 완료하기 전에 오버 스크롤-> 바닥 글이 제거되면 목록의 끝으로 다시 이동합니다. 이것에 부딪 쳤습니까?
Vadim Peretokin 2012

신경 쓰지 마십시오. littleFluffyKitty와 동일한 문제가 발생했습니다. 맞춤형 어댑터를 사용해야합니다.
Vadim Peretokin 2012

간단합니다! Google에 문제 제기시 +100.
Tomasz

37

바닥 글을 숨기기 전에 바닥 글 높이를 0px 또는 1px로 설정해보세요. 또는 바닥 글보기를 wrap_content높이로 감싸고 FrameLayout내부보기를 숨기거나 표시하여 FrameLayout표시합니다. 높이가 적절하게 감싸 야합니다.


뷰의 높이를 어떻게 강제 설정합니까? 나는 setMinimumHeight (0); 숨기기 전에 작동하지 않는 것 같습니다. GONE으로 설정했지만 셀의 공간은 여전히 ​​남아 있습니다.
Maurice

높이와 너비는 레이아웃 매개 변수이므로 새 너비 / 높이로보기에 대한 LayoutParameters 개체를 설정해야합니다. 이 SO 답변을 참조하십시오 : stackoverflow.com/a/2767142/59058 . 기본적으로 너비, 높이 및 여백은보기 자체가 아니라보기의 컨테이너에 실제로 적용되는 속성이므로 부모 연결 LayoutParameter 개체를 사용하여 정의합니다.
Yoni Samlan 2011

나는 그것이 헤더에서 작동하지 않는다고 생각하고, 첨부되고 getLayoutParams ()라는 헤더에 null을 얻었습니다.
Vadim Peretokin 2012

5

제 경우에는 addFooterView / removeFooterView ()로 인해 일부 인공물이 발생합니다. 그리고 다른 해결책을 찾았습니다. FrameLayout을 FooterView로 사용했습니다. 그리고 Footer를 추가하고 싶을 때 mFrameFooter.addView (myFooter); 및 mFrameFooter.removeAllViews (); 제거를 위해.

FrameLayout frameLayout = new FrameLayout(this);
listView.addFooterView(frameLayout);
......
......
//For adding footerView
frameLayout.removeAllViews();
frameLayout.addView(mFooterView);
//For hide FooterView
frameLayout.removeAllViews();

매력처럼 작동합니다. 받아 들여지는 대답이어야합니다. :)
King of Masses


4

내 프로젝트에서 잘 작동합니다.

1. 먼저 바닥 글보기 추가

mListView.addFooterView(mFooterView); mListView.setAdapter(mAdapter);

2. 가시성 설정

mFooterView.setVisibility(View.GONE); mFooterView.setPadding(0, 0, 0, 0);

3. 비공개 설정

mFooterView.setVisibility(View.GONE); mFooterView.setPadding(0, -1*mFooterView.getHeight(), 0, 0);


2

@YoniSamlan이 지적했듯이 간단한 방법으로 달성 할 수 있습니다. 지정해야합니다

android:layout_height="wrap_content" 

"추가로드"버튼이 포함 된 ViewGroup에서 FrameLayout 일 필요는 없습니다. LinearLayout을 사용하는 간단한 작업 예제는 아래를 참조하십시오.

두 이미지 모두 맨 아래로 스크롤되는 화면을 보여줍니다. 첫 번째 항목에는 "추가로드"버튼을 둘러싼 보이는 바닥 글이 있습니다. 두 번째 이미지는 버튼의 가시성을 GONE으로 설정하면 바닥 글이 축소되는 것을 보여줍니다.

가시성을 변경하여 바닥 글 (일부 콜백 내부)을 다시 표시 할 수 있습니다.

loadMore.setVisibility(View.VISIBLE);  // set to View.GONE to hide it again

바닥 글이 보이는 listView 바닥 글이 사라진 listView

평소대로 listView 초기화를 수행하십시오.

    // Find View, set empty View if needed
    mListView = (ListView) root.findViewById(R.id.reservations_search_results);
    mListView.setEmptyView(root.findViewById(R.id.search_reservations_list_empty));

    // Instantiate footerView using a LayoutInflater and add to listView
    footerView = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE))
            .inflate(R.layout.load_more_footer_view, null, false);
    // additionally, find the "load more button" inside the footer view
    loadMore = footerView.findViewById(R.id.load_more);
    loadMore.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            fetchData();
        }
    });

    // add footer view to the list
    mListView.addFooterView(footerView);

    // after we're done setting the footerView, we can setAdapter
    adapter = new ReservationsArrayAdapter(getActivity(), R.layout.list_item_reservations_search, reservationsList);
    mListView.setAdapter(adapter);

load_more_footer_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
    android:id="@+id/load_more"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="9dp"
    android:gravity="center"
    android:layout_gravity="center"
    android:background="@drawable/transparent_white_border"
    android:textColor="@android:color/white"
    android:text="@string/LOAD_MORE"/>


2

Android의 버그 일 것입니다.

바닥 글보기를 동적으로 제거하거나 추가 할 필요가 없습니다. 지정되지 않은 높이 부모 레이아웃 (xml 파일에서 확장하거나 프로그래밍 방식으로 생성)을 만든 다음 숨기거나 표시하려는 뷰를 추가하기 만하면됩니다.

그리고 부모 레이아웃이 아닌 뷰를 VISIBLE 또는 GONE 또는 다른 것으로 설정할 수 있습니다. 그것은 나를 위해 작동합니다.


0

익숙한

footer.removeAllViews();

이것은 바닥 글을 제거하지 않지만 자식을 플러시합니다. 다시 아이들을 채워야합니다. 확인 가능

footer.getChildCount()<2

0

나는 또한 호출 후 추가해야 할 경우 강제로 다시 생성하기 onContentChanged()위해 호출 할 수 있음을 발견했지만 (사용하는 경우 ListActivity) 매우 추악한 해킹입니다.ListViewHeaderViewsetAdapter()


0

이것을 처리하는 ListView를 만들었습니다. 또한로드 할 데이터가 더 이상 없을 때까지 데이터를로드하는 무한 목록보기를 처리하기 위해 만든 EndlessScrollListener를 사용하는 옵션도 있습니다.

여기에서 이러한 클래스를 볼 수 있습니다.

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/helper/ListViewWithLoadingIndicatorHelper.java-Helper to make it possible to use the SimpleListViewWithLoadingIndicator에서 확장하지 않고 기능.

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/listener/EndlessScrollListener.java- 사용자가 데이터를로드하기 시작하는 리스너 ListView의 맨 아래에 도달하려고합니다.

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/view/SimpleListViewWithLoadingIndicator.java-EndlessListView . 이 클래스를 직접 사용하거나 확장 할 수 있습니다.


0

이 문제를 모든 곳에서 해결할 수있는 작은 해킹 방법이 있습니다. LinnearLayout과 같은 부모 레이아웃에 목록보기 및 바닥 글보기 (하위 레이아웃 만)를 배치하고 목록보기 아래의 바닥 글보기를 기억하십시오.

이 바닥 글보기가 사라지고 일반보기처럼 가시성을 제어합니다. 그리고 끝났습니다!


0

먼저 다음과 같이 내 바닥 글을 목록보기에 추가합니다.

listView.addFooterView(Utils.b);

그런 다음 버튼을 클릭하면보기를 제거하고

listView.removeFooterView(Utils.b);

비동기를 눌렀을 때마다 바닥 글을 추가하고 있으며 중복 항목이 없습니다. 또한 카운트를 확인할 수 있으므로 이와 같이

if(listView.getFooterViewsCount() > 0){//if footer is added already do something}

-1

ListView그냥 통화 에서 바닥 글을 제거하고 싶을 때

listView.addFooterView(new View(yourContext)); 

공간을 예약하지 않는 더미 빈 뷰를 추가합니다.


1
문서에 "addFooterView가 두 번 이상 호출되면 뷰가 추가 된 순서대로 나타납니다."
max4ever
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.