安卓小筆記

如何實現可動態調整隱藏header的listview

需求:根據某種需要,可能需要動態調整listview的頁眉頁腳,譬如將header作爲顯示板使用。

難點:listView.addHeaderView()方法必須在setAdapter()方法前調用,否則就會拋異常。至於爲什麼會拋異常,查看下ListView的源代碼即可發現。因此,在設置HeaderView之後又想將headerView移除或者隱藏,則需要繞很大的彎子:將adapter保存起來-移除headerView-(或者更換headerview)-再將adapter設置上去。

隱藏headerview思路:使用View.GONE屬性進行隱藏
嘗試1.itemView結構如下:
  <LinearLayout android:id="@+id/item_root"
   android:layout_width="fill_parent"
   android:layout_height="50dip"
   android:orientation="vertical" >
<TextView android:id="@+id/tv_1" />
<TextView  android:id="@+id/tv_2" />
</LinearLayout>
此時,有如下邏輯:
  ListViewlistView = xxxx;
 listView.addHearderView(item_root);
 listView.setAdapter(adapter);
 adapter.add(xxxxx);添加數據
 item_root.setVisibility(View.GONE);
按道理,最後一句應該可以起到隱藏headerView的目的,但實際效果(魅族MX上測試發現),item_root的地方的確沒有控件了,但item_root佔用的50dip高度還在,即原來headerView的地方變成了一片空白區域!和View.INVISIBILE效果一樣了,汗死!
 
 繼續嘗試如下,修改itemView的結構:
 <LinearLayout android:id="@+id/item_root"
   android:layout_width="fill_parent"
   android:layout_height="50dip"
   android:orientation="vertical">
 <LinearLayout android:id="@+id/item_container"
<TextView  android:id="@+id/tv_1" />
<TextView  android:id="@+id/tv_2" />
 </LinearLayout>
</LinearLayout>
 此結構較之前的結構增加了一個多餘的Layout(item_container)來囊括item內部控件。此時,如果在item_container .setVisibility(View.GONE)則可以完美實現隱藏HeaderView的目的!
結論:View.GONE屬性貌似不作用在根Layout上。

新的問題:
如果在item_root上使用了Shape背景,且此背景存在MinSize,那麼此方法又失效了。。。
規避處理:如果的確必須要在HeaderView上添加背景background的話,那麼請將background設置在item_container上吧,不要設置在item_root上,如此就可以規避新的問題了。







SharedPreferences類,它是一個輕量級的存儲類,特別適合用於保存軟件配置參數。

SharedPreferences保存數據,其背後是用xml文件存放數據,文件存放在/data/data/<package name>/shared_prefs目錄下:

一個簡單的存儲代碼如下:

SharedPreferences sharedPreferences = getSharedPreferences("wujay", Context.MODE_PRIVATE); //私有數據
Editor editor = sharedPreferences.edit();//獲取編輯器
editor.putString("name", "wujaycode");
editor.putInt("age", 4);
editor.commit();//提交修改


生成的wujay.xml文件內容如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="name">wujaycode</string>
<int name="age" value="4" />
</map>

 

分析以下幾個方法:

一、getSharedPreferences(name,mode)

方法的第一個參數用於指定該文件的名稱,名稱不用帶後綴,後綴會由Android自動加上;

方法的第二個參數指定文件的操作模式,共有四種操作模式。

四種操作模式分別爲:

1. MODE_APPEND: 追加方式存儲

2. MODE_PRIVATE: 私有方式存儲,其他應用無法訪問

3. MODE_WORLD_READABLE: 表示當前文件可以被其他應用讀取

4. MODE_WORLD_WRITEABLE: 表示當前文件可以被其他應用寫入

 

二、edit()方法獲取editor對象

Editor editor = sharedPreferences.edit();

editor存儲對象採用key-value鍵值對進行存放,editor.putString("name", "wujaycode");

通過commit()方法提交數據

 

與之對應的獲取數據的方法:

SharedPreferences share=getSharedPreferences("Acitivity",Activity.MODE_WORLD_READABLE);

int i=share.getInt("i",0);

String str=share.getString("str","");

boolean flag=share.getBoolean("flag",false);

getString()第二個參數爲缺省值,如果preference中不存在該key,將返回缺省值


 

如果你想要刪除通過SharedPreferences產生的文件,可以通過以下方法:

File file= new File("/data/data/"+getPackageName().toString()+"/shared_prefs","Activity.xml");

if(file.exists()){

file.delete();

Toast.makeText(TestActivity.this, "刪除成功", Toast.LENGTH_LONG).show(); }

 

三、訪問其他應用中的Preference

如果要訪問其他應用中的Preference,必須滿足的條件是,要訪問的應用的Preference創建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE權限。

舉例,假如有個<package name>爲com.wujay.action下面的應用使用了下面語句創建了Preference,getSharedPreferences("wujay", Context.MODE_WORLD_READABLE),

現在要訪問該Preferences:





如果adapter中的數據量很大的時候,在加載listview時會出現卡頓的現象。這是會讓用戶抓狂!最好的解決辦法就是先加載一定數量的數據,然後在最下方提示正在加載!

  動態加載就是把放入adapter中的數據分好幾次加載。在用戶拖動listview時再加載一定的數據,和sina微博的客戶端類似。

  給listview添加OnScrollListener監聽事件默認會覆蓋下面兩個方法:

  Java代碼 收藏代碼

  1.   OnScrollListener loadListener=new OnScrollListener() {
  2.   @Override
  3.   public void onScroll(AbsListView view, int firstVisibleItem,
  4.   int visibleItemCount, int totalItemCount) {
  5.   lastItem = firstVisibleItem + visibleItemCount;
  6.   }
  7.   @Override
  8.   public void onScrollStateChanged(AbsListView view, int scrollState) {
  9.   //listview滾動時會執行這個方法,這兒調用加載數據的方法。
  10.   adapter.notifyDataSetChanged();//提醒adapter更新
  11.   uList.setSelection(lastItem - 1);//設置listview的當前位置,如果不設置每次加載完後都會返回到list的第一項。
  12.   }
  13.   }
  14.   };



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章