android復用
❶ android中listView怎麼復用多種布局
adapter填充數據的時候,我們一般要實現以下方法:
1 public int getCount(){ }
2 public Object getItem(int position) {}
3 public long getItemId(int position) {}
4 public View getView(int position, View view, ViewGroup viewGroup){}
但是要實現復用多種布局的話我們還要實現下面2個方法
1 public int getItemViewType(int position) {}
返回我們要復用的布局類型,假如我們要復用一個tab結構和item結構,我們可以這么來寫
類別的數值在(0,類別總數-1)之間
public static final int TYPE_UNKNOW = 0;
public static final int TYPE_TAB = 1;
public static final int TYPE_LIST_ITEM = 2;
public static final int TYPE_MAX_COUNT = 3;
@Override
public int getItemViewType(int position) {
//復用tab結構
if (position == 1) {
return TYPE_TAB;
}
//復用一般的item結構
int size = CollectionUtils.size(feedDataList);
if (position >= 1 && size > 0 && position < (size + 2)) {
return TYPE_LIST_ITEM;
}
return TYPE_UNKNOW;
}
類別總數是3,類別對應的int值應該在0 - 2 之間,它們分別是
public static final int TYPE_UNKNOW = 0;
public static final int TYPE_TAB = 1;
public static final int TYPE_LIST_ITEM = 2;
2 public int getViewTypeCount() { } 返回復用布局的總數,這里是3
@Override
public int getViewTypeCount() {
return TYPE_MAX_COUNT;
}
在adapter中的getView方法中,我們就可以這樣來寫:
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
ItemViewHolder itemViewHolder;
TabViewHolder tabViewHolder;
int viewType= getItemViewType(position);
switch (viewType) {
case TYPE_TAB:
if(convertView == null ) {
tabViewHolder = new TabViewHolder(mContext);
//給contenView賦值,並給viewHolder設置tag
tabViewHolder.findView(position,convertView,viewGroup);
}else{
//直接復用
tabViewHolder = (TabViewHolder)convertView.getTag();
}
//這里是處理業務邏輯的方法
tabViewHolder.setView(position);
return tabViewHolder.layout;//返回convertView
case TYPE_LIST_ITEM:
if (convertView == null) {
itemViewHolder = new ItemViewHolder(mContext);
//給contenView賦值,並給viewHolder設置tag
itemViewHolder.findView(position, convertView, viewGroup);
} else {
//convertView不為空,直接復用
itemViewHolder = (ItemViewHolder) convertView.getTag();
}
//處理業務邏輯
itemViewHolder.setView((FeedComment)getItem(position));
return itemViewHolder.layout;//返回convertView
case TYPE_UNKNOW:
return null;
}
return null;
}
說明:處理復用多個布局的時候,如果不調用上面getViewTypeCount()和getItemType(),很容易就出現viewHolder類型轉換錯誤。因為在屏幕滾動的時候,view.getTag()返回的viewHolder有2種,我們拿到的viewHolder可能就不是理想中的viewHolder,這個時候類型轉換錯誤就出現了。
❷ android listview的生命周期,為什麼要這樣復用,有什麼好處
主要是為了減少內存的消耗,如果不進行復用,那麼創建一千個Item,就需要實例化1千個實例,會造成內存溢出。目前listview採用的策略是,只顯示一屏幕的View,當View超過一屏幕,將其移除後放到最下面進行復用。
好處:減少內存佔用,避免內存溢出。
壞處:CPU佔用會稍微高點,因為會不斷重復Iitem的溢出添加。
❸ android 代碼盡可能復用好嗎
在軟體開發過程中,程序代碼的復用,是非常重要的概念。我核槐們總是需要使用一些現有的模塊、包、框架,或開發自己的模塊、包、框架,來實現對程序代碼的復用。比如在javaWeb編程過程中,經常使用的Struts和Spring等框架,就可以大大簡化我們的開改清友發過程,提高開發效率。
在開發Android應用程序的過程中,同樣有這方面的需求。Android系統包含的Android應用程序開發框架正態,已經是一個可以很好的提高開發效率的框架,但它並不能滿足我們的所有需要。比如我們再開發某一類應用程序時,會發現這一類應用程序,會有大量的代碼是重復的,這時,就需要我們優化設計並採用某種方式,實現重復代碼的復用,使開發此類應用程序變得簡單。
類似開發其他Java應用一樣,我們可以將可復用的代碼,打成一個jar包,供所有需要的項目使用。這樣,可以解決很大一部分代碼復用的問題,比如在不同應用中可以復用的核心演算法等。
但是,如果可復用代碼包含了大量的資源,包括圖片、音樂文件甚至界面布局等的時候,代碼的復用就會變得麻煩起來,因為這些東西不能被一起打包到jar包裡面,供需要的項目使用。而沒有這些資源,可復用的代碼又無法運行。在這種情況下,最好的解決辦法,就是使用Android2.2之後的SDK支持的庫項目(Lib Project)。
一個庫項目是一個包含了源碼和資源的項目,它可以被其他的項目引用,從而讓其他項目使用它包含的代碼和資源。多個Android應用程序項目可以引用同一個庫項目,同一個Android應用程序項目也可以引用多個庫項目。
創建庫項目和引用庫項目是很容易的事情。我們以Eclipse環境下的開發為例。如果要創建庫項目,只需要在創建普通Android項目完成後,打開設置項目屬性的面板,在Android選項卡下選中Is Library復選框即可(如下圖所示)。
現有的項目引用庫項目的時候,也只需要打開項目屬性設置面板,在Android選項卡下添加需要引用的項目(如下圖所示)。
完成以上操作後,我們就成功的創建了一個庫項目,或在現有項目中引用了一個庫項目,是不是很簡單?
當然,在使用庫項目的時候,因為Android項目結構及編譯工具的特殊性,我們需要注意一些要點,列舉如下:
工作項目和庫項目的資源名稱,盡量不要重復,如果重復,編譯器會優先使用工作項目的資源;
無法將一個庫項目導出為一個jar文件;
庫項目的Android系統版本必須等於或低於工作項目的系統版本;
每一個庫項目都會生成一個R文件,工作項目被編譯時,將會合並工作項目和庫項目的R文件,如果R文件中有常量同名,將使用工作項目R文件中的常量;如果引用了多個庫項目,庫項目中的R文件有常量重名,將根據庫項目被引用的順序來確定常量的使用優先順序。
❹ android中listView怎麼復用多種布局
復用多種布局具體是什麼樣?一般是在item里添加布局盯悶的方式,listview里輪悶一般不做操作,重寫Adapter,在裡面的getview里獲取item的布局,然後可以在裡面進行凱桐彎布局的更改。
❺ Android RadioButton復用怎麼解決
默認狀態不要選中就好了,或者跳轉下一個頁面時腔型兆伍租候,把之前的選項全部清空。
radioGroup.clearCheck();//清空狀態
radioGroup.check(radioButton.getId());//選中狀態租廳
❻ android 除了include還有其他復用布局的方法么
盡管Android通過內置了各種各樣的控制項提供了微小、可復用的交互性元素,也許你需要復用較大的
組件 ---- 某些特定布局文件 。為了更有效率復用的布局文件,你可以使用<include />以及<merge />
標簽將其他的布局文件加入到當前的布局文件中。
復用布局文件是一種特別強大的方法,它允許你創建可復用性的布局文件。例如,一個包含「Yse」or「No」的
Button面版,或者是帶有文字說明的 Progressbar。復用布局文件同樣意味著你應用程序里的任何元素都能從
繁雜的布局文件提取出來進行單獨管理,接著你需要做的只是加入這些獨立的布局文件(因為他們都是可復用地)。
因此,當你通過自定義View創建獨立的UI組件時,你可以復用布局文件讓事情變得更簡單。
1、創建一個可復用性的布局文件
如果你已經知道復用布局的」面貌」,那麼創建、定義布局文件( 命名以」.xml」為後綴)。例如,這里是一個來自
G- Kenya codelab 的布局文件,定義了在每個Activity中都要使用的一個自定義標題 (titlebar.xml):由於這些
可復用性布局被添加至其他布局文件中,因此,它的每個根視圖(root View)最好是精確(exactly)的。
[java] view plainprint?
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width=」match_parent」
android:layout_height="wrap_content"
android:background="@color/titlebar_bg">
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/gafricalogo" />
</FrameLayout>
2、使用<include />標簽
在需要添加這些布局的地方,使用<include />標簽 。 例如,下面是一個來自G-Kenya codelab的布局文件,
它復用了上面列出的「title bar」文件, 該布局文件如下:
[java] view plainprint?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width=」match_parent」
android:layout_height=」match_parent」
android:background="@color/app_bg"
android:gravity="center_horizontal">
<include layout="@layout/titlebar"/>
<TextView android:layout_width=」match_parent」
android:layout_height="wrap_content"
android:text="@string/hello"
android:padding="10dp" />
...
</LinearLayout>
你也可以在<include />節點中為被添加的布局文件的root View定義特別標識,重寫所有layout參數即可(任何
以「android:layout_」為前綴的屬性)。例如:
[java] view plainprint?
<include android:id=」@+id/news_title」
android:layout_width=」match_parent」
android:layout_height=」match_parent」
layout=」@layout/title」/>
3、使用<merge />標簽
當在布局文件中復用另外的布局時, <merge />標簽能夠在布局層次消除多餘的視圖元素。例如,如果你的
主布局文件是一個垂直地包含兩個View的LinearLayout,該布局能夠復用在其他布局中,而對任意包含兩個View的
布局文件都需要一個root View(否則, 編譯器會提示錯誤)。然而,在該可復用性布局中添加一個LinearLayout
作為root View,將會導致一個垂直的LinearLayout包含另外的垂直LinearLayout。內嵌地LinearLayout只能減緩
UI效率,其他毫無用處可言。
該復用性布局利用.xml呈現如下:
[java] view plainprint?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width=」match_parent」
android:layout_height=」match_parent」
android:background="@color/app_bg"
android:gravity="horizontal">
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/add"/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/delete"/>
</LinearLayout>
為了避免冗餘的布局元素,你可以使用<merge />作為復用性布局文件地root View 。例如:
使用<merge />標簽的布局文件:
[java] view plainprint?
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/add"/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/delete"/>
</merge>
現在,當你添加該布局文件時(使用<include />標簽),系統忽略< merge />節點並且直接添加兩個Button去
取代<include />節點。
❼ Android-Bitmap復用時內存大小計算
主要是Bitmap的這兩個方法得到的Bitmap的值,會在內存復用體現。
如果不使用內存復用,這兩個方法是一樣的效果。
在通過復用 Bitmap 來解碼圖片時,那麼 getByteCount() 表示新解碼圖片佔用內存的大 小,getAllocationByteCount() 表示被復用 Bitmap真實佔用的內存大小。
比如:上面的圖片,黑色區域是當前Bitmap對象實際內存佔用大小,但是這部分內存中,只有紅色區域是新佔用的,而其他的區域是可以復用的但是沒被復用(即Bitmap中新的圖片只是佔用了8個大小,但是Bitmap實際大小其實是有20),那麼如果使用getByteCount()就只會返回被復用區域的內存大小,所以使用getByteCount()返回內存區域的大小,其實是小於等於實際大小的。
以為你Bitmap佔用內存大小,是由最大的圖片來決定的,如果放入一張更小的圖片,其實並不會減少Bitmap佔用的內存大小。
可以認為:
getByteCount()只是圖片的大小
getAllocationByteCount()是Bitmap的大小
因為Bitmap可以復用,所以Bitmap可以放入不同的圖片,當Bitmap放入更大的圖片的時候,就會佔用更大的內存,但是這個時候如果對Bitmap對象進行復用,放入一張小圖片,並不會改變Bitmap的大小。
❽ 如何將android項目的圖片等資源文件打包復用
可以將資源做成一個APK
然後在需要調用的application中使用createPackageContext方法獲取資源APK的Context 然後就可以訪問了
❾ 【Android開發】ListView適配器BaseAdapter的getView復用問題
解扒拆決方法:1、取消復用,就是那個判斷語句。(最簡單的方法,列表數據過多不建議使肢此燃用歷虛)
2、為每個item布局添加tag
3、用一個數組變數保存選中狀態,通過保存的狀態判斷選中。(我常用的方法)