1. 程式人生 > >ListView如何動態顯示與隱藏headerview,footerview

ListView如何動態顯示與隱藏headerview,footerview

前言

很多情況我們需要用到ListView的addHeaderView(View v)以及addFooterView(View v)以滿足我們的需求。比如我們專案中的情況:ListView上面需要顯示一個迴圈的廣告輪播圖,我們是使用了自定義的一個控制元件Loopbanner來顯示輪播圖,使用的listview.addHeaderView(loopbanner);來新增到ListView的頭部這樣就可以不用巢狀ScrollView。但是又有一個新的需求,就是假如廣告圖片沒有資料的時候將廣告位隱藏掉。本來我想的挺開心,直接loopbanner.setVisibility(View.GONE);不久可以了嘛,但是試了一下,loopbanner倒是隱藏掉了,但是還是它佔據一定的空間還是保留著,空蕩蕩的一片

找方案

在網上找了一個方法就是先隱藏然後,設定padding,
隱藏時

loopBanner.setVisibility(View.VISIBLE);
this.loopBanner.setPadding(0, -loopBanner.getHeight(), 0, 0)

需要顯示時

 loopBanner.setVisibility(View.GONE);
 this.loopBanner.setPadding(0, 0, 0, 0);

這種方案,確實有了效果,去除了空蕩蕩的一篇片,但是在我們的專案中出了狀況,就是使用者先下拉重新整理幾次,然後上滑,就忽然崩潰,報的錯誤是:

Process
: com.test, PID: 20067 java.lang.NullPointerException: Attempt to invoke virtual method 'com.test.base.adapter.ViewHolder com.test.base.adapter.ViewHolder.setViewGone(int)' on a null object reference at com.test.adapter.CPostAdapter.convert(CPostAdapter.java:63) at com.test.adapter.CPostAdapter
.convert(CPostAdapter.java:33) at com.test.base.adapter.UniversalAdapter.getView(UniversalAdapter.java:53) at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:220) at android.widget.AbsListView.obtainView(AbsListView.java:2346) at android.widget.ListView.makeAndAddView(ListView.java:1876) at android.widget.ListView.fillDown(ListView.java:702) at android.widget.ListView.fillGap(ListView.java:666) at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5106) at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3463) at android.widget.AbsListView.onTouchMove(AbsListView.java:3878) at android.widget.AbsListView.onTouchEvent(AbsListView.java:3691) at android.view.View.dispatchTouchEvent(View.java:9306) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2548) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2241) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255) at cn.bingoogolapple.refreshlayout.BGARefreshLayout.dispatchTouchEvent(BGARefreshLayout.java:425) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255) at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2403) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1737) at android.app.Activity.dispatchTouchEvent(Activity.java:2820) at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2364) at android.view.View.dispatchPointerEvent(View.java:9526) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4255) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4121) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3662) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3715) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3681) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3807) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3689) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3864) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java

這個錯誤挺奇怪的,holder報空,以前應該從來沒遇到過,我們的baseAdapter也是經多多次檢驗與改良應該沒什麼問題,但是有一點可以確定,就是我改了隱藏headerView之後才出現的這個錯誤的,所以我就又尋找了一個方案

最終方案

就是給LoopBanner外加了一層FrameLayout,使用frameLayout.removeAllViews和addView確定顯示以及不顯示,目前還未遇到holder報空的情況

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

相關推薦

ListView如何動態顯示隱藏headerviewfooterview

前言 很多情況我們需要用到ListView的addHeaderView(View v)以及addFooterView(View v)以滿足我們的需求。比如我們專案中的情況:ListView上面需要顯示一個迴圈的廣告輪播圖,我們是使用了自定義的一個控制元件Loo

easyui toolbar 動態顯示隱藏

//隱藏第一個按鈕 $('div.datagrid-toolbar a').eq(0).hide(); //隱藏第一條分隔線 $('div.datagrid-toolbar div').eq(0).hide()

ListView動態顯示隱藏HeaderViewFooterView

roi ron mas relative 監聽事件 isp 刪除 listen 具體實現 ListView中動態顯示和隱藏Header&Footer 解決思路: 直接設置HeaderView和FooterView.setVisibility(View.GONE)無效

Mint-ui 中 Popup 作為組件引入控制彈出框的顯示隱藏遇到的問題。

cli bubuko 方式 解決 pro 傳遞 顯示與隱藏 gin ott Popup組件的結構: <template> <div> <!--分享彈出窗 begin--> <mt-popup class="sha

用JavascriptDHTML控制表格的某一列的顯示隱藏

-i div doc bootstra lns fill 成功 oot ini <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1

小程式--一鍵獲取手機號控制按鈕顯示隱藏

點選按鈕,呼叫後臺介面獲取到使用者的手機號,將獲取到的手機號渲染到input框裡面,同時,按鈕消失,即當input框不為空的時候,按鈕消失;input框為空的時候,按鈕顯示。 <view class="addAddress addAddressLine"> &

利用 Vue 內聯樣式的繫結方法實現按鈕的顯示隱藏

<template> <div> <div class="titles"> <div style="display: flex;"> <div class="btn-box-content"&g

用JsDHTML控制表格的某一列的顯示隱藏

<!DOCTYPE  HTML  PUBLIC  "-//W3C//DTD  HTML  4.0  Transitional//EN"> <HTML> <HEAD> <TITLE>  New  Document  </

unity 動態控制 元件或指令碼的啟用關閉 物件的顯示隱藏

Unity中會經常有控制一些物件或元件的需求,希望他們在某一時間點出現,或者某一時間點消失。PS:如果你覺得這篇文章幫到了你,請頂我一下。元件或指令碼:GameObject.Find("Broken")

ArcGIS API For Javascript之多圖層顯示隱藏圖層要素選框查詢

5、多圖層的載入與隱藏 利用Html+Javascript前端程式設計實現上傳到服務端的地圖服務中的多圖層的載入與隱藏。本實驗中除了底圖之外,添加了共10個圖層,分別為 賓館酒店_point (0) 餐飲_point (1) 超市商城_point (2) 地級市_font

JS------滑鼠hover動作顯示隱藏的切換

html <ul class="ts">    <li class="action">      <div class="hd"></div>     <div class="con"></div>  

JQuery 彈出視窗(div顯示隱藏)隱藏層半透明

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="te

文件夾顯示隱藏

DDU col tcc agg cpm iar 顯示 svc dcs %E8%BD%AC%E6%8D%A2%E6%9C%89%E7%AC%A6%E5%8F%B7%E6%95%B4%E6%95%B0%E4%B8%BA%E6%97%A0%E7%AC%A6%E5%8F%B7%E6

菜單欄的顯示隱藏

rip ott stop ble view text rem wid http 效果圖: 代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="

點擊同一處顯示隱藏

bsp cli strong play 隱藏 post nbsp 顯示與隱藏 document HTML <a href="javascript:void()" onclick="show()">點擊此處顯示或隱藏</a> <div id="h

div 顯示隱藏

顯示與隱藏 繼承 lis line bili head 塊元素 表格 位置 最近寫項目用到DIV隱藏,以下引用http://www.cnblogs.com/dotLive/archive/2007/04/04/699302.html visibility隱藏的對象還保留對象

HTML div鼠標懸停控制子控件顯示隱藏

spa ansi lock 控件顯示 pan har color 鼠標 spl HTML div鼠標懸停控制子控件顯示與隱藏 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <m

多個圖片的顯示隱藏

img for over TP each foo none function com //footer的微信微博頭條的二維碼的顯示與隱藏 var contact_logo=$(".contact-logo"); var contact_

js實現密碼框的點擊眼睛的顯示隱藏

password var ide oct class 密碼框 fun clas ext 密碼框的點擊眼睛的顯示與隱藏,圖標引用是bootstrap中的fontawesome (復制整個 font-awesome 文件夾到您的項目中) 還需要引入 <link rel

jQuery --下拉菜單的顯示隱藏

relative ldr src auto children oct code wid play 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charse