A. android list怎麼緩存
要想優化ListView首先要了解它的工作原理,列表的顯示需要三個元素:ListView、Adapter、顯示的數據;
這里的Adapter就是用到了適配器模式,不管傳入的是什麼View在ListView中都能顯示出來。
下面簡單說下上圖的原理:
1、如果你有幾千幾萬甚至更多的選項(item)時,其中只有可見的項目(滿屏顯示的Item數目)存在內存(說的優化就是說在內存中的優化!)中,其他的在Recycler中
2、ListView先請求一個type1視圖(getView)然後請求其他可見的項目。convertView在getView中是空(null)的,第一次都是為空的,只要顯示過了convertView都不為空,會保存在Recycler中
3、當item1滾出屏幕,並且一個新的項目從屏幕低端上來時,ListView再請求一個type1視圖。convertView此時不是空值了,它的值是item1。你只需設定新的數據然後返回convertView,不必重新創建一個視圖,省去了inflate和findViewById的時間,性能就得到了優化。
AneData全能文件恢復,超強數據恢復工具 硬碟移動硬碟SD卡U盤相機手機內存卡全支持
查 看
了解了它的工作原理後,我們就可以重復利用convertView,只要不為空就直接使用,改變它的內容就行了。
使用ListView的時候都會搭配一個Adapter,為了使得性能更優,ListView會緩存行item(某行對應的View)。ListView通過Adapter的getView函數獲得每行的item。
更多問題解決辦法請參考android學習手冊,例子、源碼、文檔全部搞定,採用androidstudo的目錄結構,360手機助手中下載。
java">packagecom.dzt.listviewdemo;
importjava.util.ArrayList;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.os.Bundle;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.BaseAdapter;
importandroid.widget.ImageView;
importandroid.widget.ListView;
importandroid.widget.TextView;
{
privateListAdapteradapter;
privateListViewlv=null;
privateArrayList<string>list=newArrayList<string>();
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=(ListView)findViewById(R.id.lv_list);
adapter=newListAdapter();
for(inti=0;i<100;i++){
list.add(item+i);
}
lv.setAdapter(adapter);
}
{
;
ListAdapter(){
mInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
publicintgetCount(){
//TODOAuto-generatedmethodstub
returnlist.size();
}
@Override
publicObjectgetItem(intposition){
//TODOAuto-generatedmethodstub
returnlist.get(position);
}
@Override
publiclonggetItemId(intposition){
//TODOAuto-generatedmethodstub
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
//TODOAuto-generatedmethodstub
System.out.println(getView+position++convertView);
viewHolderholder=null;
if(convertView==null){
convertView=mInflater.inflate(R.layout.item,null);
holder=newviewHolder();
holder.text=(TextView)convertView.findViewById(R.id.tv_text);
holder.image=(ImageView)convertView
.findViewById(R.id.iv_img);
convertView.setTag(holder);
}else{
holder=(viewHolder)convertView.getTag();
}
holder.text.setText(list.get(position));
if(position%2==0){
holder.image.setImageResource(R.drawable.ic_launcher);
}else{
holder.image.setImageResource(R.drawable.icon);
}
returnconvertView;
}
}
/**
*使用一個類來保存Item中的元素
*
*@authorAdministrator
*
*/
publicstaticclassviewHolder{
publicTextViewtext;
publicImageViewimage;
}
}
B. 關於Android界面組件的基本用法
1.文本框(TextView)和編輯框(EditText)
文本框(TextView)不允許用戶編輯文本內容,而編輯框(EditText)允許用戶編輯文本內容
2.按鈕(Button)和圖片按鈕(ImageButton)
Button顯示文字,ImageButton顯示圖片。
為ImageButton指定android:text屬性沒用,不會顯示文字
可以指定android:background為按鈕增加背景圖片,但這圖片是固定的
可以指定android:src為圖片按鈕增加圖片屬性
其實,src才是設置圖標,而background只是設置背景。
如果控制項的大小是100 100 圖片資源是80 80的話,那麼用src,圖片就會居中顯示,如果使用background那麼圖片就會被拉伸充滿控制項。
重要的是,background是底層的圖片資源,src是覆蓋在background上面的資源,他們可以疊加使用,實現選中的效果。
3.單選按鈕(RadioButton)和復選框(CheckBox)
多了一個android:checked屬性,用於指定初始時是否被選中
4.計時器組件Chronometer用法
紅色字體表示常用的方法
5.圖像視圖(ImageView)
它支持屬性android:scaleType setScaleType(ImageView.ScaleType)
matrix(ImageView.ScaleType.MATRIX):使用matrix方式進行
fixXY(ImageView.ScaleType.FIX_XY):對圖片橫向縱向獨立縮放,會改變縱橫比
fitStart(ImageView.ScaleType.FIT_START):保持縱橫比,圖片較長的邊長與ImageView相應的邊長相等,縮放後放在左上角
fitCenter(ImageView.ScaleType.FIT_CENTER):保持縱橫比,圖片較長的邊長與ImageView相應的邊長相等,縮放後放在中央
fitEnd(ImageView.ScaleType.FIT_END):保持縱橫比,圖片較長的邊長與ImageView相應的邊長相等,縮放後放在右下角
center(ImageView.ScaleType.CENTER):放中間,不縮放
centerCrop(ImageView.ScaleType.CENTER_CROP):保持縱橫比,使圖片能完全覆蓋ImageView
centerInside(ImageView.ScaleType.CENTER_INSIDE):保持縱橫比,使ImageView能完全顯示圖片
6.spinner的功能和用法
如果可以確定spinner裡面的列表項,那麼直接在/res/layout/main.xml裡面指定
然後在/res/value/string.xml裡面指定
如果不確定裡面的列表項,那麼必須要提供一個Adapter,這個Adapter負責決定Spinner列表每項的內容
7.日期、時間選擇器(DatePicker和TimePicker)
8.自動完成文本框(AutoCompleteTextView)
比普通文本框多了一個功能:當用戶輸入一定字元後,自動完成文本框會顯示一個下拉菜單,供用戶從中選擇,當用戶選擇某個菜單後,組件會按用戶選擇自動填寫該文本框
使用該組件很簡單,只要為它設置一個Adapter,該Adapter封裝了AutoCompleteTextView預設的提示文本
9.進度條(ProgressBar)
通過style屬性可以為ProgressBar指定風格。該屬性可以有如下的屬性值:
1.@android:style/Widget.ProgressBar.Horizontal 水平進度條
2.@android:style/Widget.ProgressBar.Inverse 不斷跳躍、旋轉畫面的進度條
3.@android:style/Widget.ProgressBar.Large 大進度條
4.@android:style/Widget.ProgressBar.Large.Inverse不斷跳躍、旋轉畫面的大進度條
5.@android:style/Widget.ProgressBar.Small 小進度條
6.@android:style/Widget.ProgressBar.Small.Inverse不斷跳躍、旋轉畫面的小進度條
ProgressBar提供如下方法來操作進度
1.setProgress(int) 設置進度的完成百分比
2.incrementProgressBy(int) 設置進度條的增加或減少。參數為正增加,參數為負減少
10.選項卡(TabHost)
TabHost僅僅只是一個簡單的容器,它提供如下方法
1.newTabSpec(String tag) 創建選項卡
2.addTab(TabHost.TabSpec tabSpec) 添加選項卡
使用TabHost的一般步驟為:
• A. 在界面中定義TabHost組件,並為該組件定義該選項卡的內容
• B. Activity應該繼承TabActivity
• C. 調用TabActivity的getTabHost()來獲取TabHost對象
• D. 通過TabHost對象的方法來創建選項卡、添加選項卡
選項卡主要由TabHost、TabWidget、FrameLayout3個組件組成,三者缺一不可,想像一下選項卡的特點,多個卡重疊在一起,所以用FrameLayout即幀布局是必要的。另外需要注意的是TabHost、TabWidget、FrameLayout三個組件的android:id必須使用系統默認的名稱,而不能自己隨意定義,否則會出錯。
11.圖像切換器(ImageSwitcher)
12.網格視圖(GridView)
使用GridView一般指定numColumn大於1,否則取默認值為1.那麼GridView就變成了ListView
屬性android:stretchMode支持如下屬性
1.none 不拉伸
2.spacingWidth 僅拉伸元素之間的間距
3.spacingWidthUniform 表格、元素之間的間距一起拉伸
4.columnWidth 僅拉伸表格
13.畫廊視圖(Gallery)(現在已經被棄用了,不過還是列出來吧)
Gallery用法很簡單——為它提供一個內容Adapter,該Adapter的getView方法所返回的View可作為Gallery的列表項。可以通過OnItemSelectedListener監聽選擇項的改變
14.列表試圖(ListView和ListActivity)
1.創建ListView由兩種方式:
2.直接使用ListView進行創建
讓Activity繼承ListActivity(繼承了ListActivity的類無需調用setContentView()來顯示頁面,可以直接設置適配器)
一旦獲得ListView後,就要創建顯示的列表項了。需要藉助內容Adapter,內容Adapter負責提供需要顯示的列表項
創建ArrayAdapter時必須指定一個textViewResourceId,該參數決定每個列表項的外觀
1.simple_list_item_1 每個列表項是普通的TextView
2.simple_list_item_2 每個列表項是普通的TextView(字體略大)
3.simple_list_item_checked 每個列表項是已勾選的列表項
4.simple_list_item_multiple_choice 每個列表項是帶多選框的文本
5.simple_list_item_single_choice 每個列表項是帶多單選按鈕的文本
15.使用AlertDialog
1.創建AlertDialog.Builder對象,該對象是AlertDialog的創建器
2.調用AlertDialog.Builder方法為對話框設置圖標、標題等
3.調用AlertDialog.Builder的create()方法創建AlertDialog對話框
4.調用AlertDialog的show()方法顯示對話框
16.使用Toast顯示提示框
步驟如下:
• 調用Toast構造器或makeText方法創建Toast對象
• 調用Toast方法來設置該消息的對齊方式等
• 調用Toast的show()方法顯示出來
• Toast toast = Toast.makeText(ToastTest.this, "信息", Toast.LENGTH_LONG).show();
17.Notification(一般顯示網路狀態、電池狀態、時間等)
使用Notification發送Notification步驟:
• 調用getSystemService(NOTIFICATION_SERVICE)方法獲取系統的Notification Manager服務
• 通過構造器創建一個Notification對象
• 為Notification設置屬性
• 通過Notification Manager發送Notification
C. android怎麼傳一個list集合
方法1: 直接讓User類繼承Serializable或者Parcelable介面即可,Intent只可以傳輸序列化的對象<pre t="code" l="java">//User類
public class User implements Serializable{
private String name;
.
}
//直接加入intent
List<User> list = new ArrayList<User>();
Intent intent = new Intent();
intent.putExtra("list",list);
方法2: 把list集合轉為字元串表示,可以使用json格式,直接用Gson框架轉換即可,再到另一個activity轉換回來<pre t="code" l="java">List<User> list = new ArrayList<User>();
Type type = new TypeToken<ArrayList<User>()>(){}.getType();
String json = new Gson().toJson(list,type);
intent.putExtra("list",json);
//轉換回List<User>
String json = getIntent.getStringExtra("list");
Type type = new TypeToken<ArrayList<User>()>(){}.getType();
List<User> list = new Gson().fromJson(json,type);
D. android里的List<Person> persons=new ArrayList<Person>(); 是什麼意思在使用sqlite資料庫時用到的。
ArrayList :數組鏈表,鏈表按數組形式存儲元素。
new ArrayList<Person>():創建一個鏈表,<>表示鏈表內放Person類型數據。
List:鏈表抽象類,是ArrayList父類
List<Person> persons:一個List引用。
E. android List 在子線程添加了數據,但是在使用的時候發現裡面沒有數據
List里是有數據的,之前的ScrollView用的就是imageViewList導入數據的就沒..
F. android里的List<Person> persons=new ArrayList<Person>(); 是什麼意思在使用sqlite資料庫時用到的。
在onItemClickListener裡面有一個position的參數,也就是對應你在給ListView設置適配器的時候的Listlist之中的下標。你可以通過list中的map也好,還是類的對象也好,是map的話就是list.get(position).get("圖片地址的key");是對象的話就是list.get(position).ImagePath;(比如說你在類中給對象定義的屬性是imagePath)就可以或得到圖片的鏈接。然後就是一個簡單的Intent傳值的問題了
G. android編程中 setListAdapter(listAdapter);什麼意思 以及具體用法是什麼
android編程中
setListAdapter(listAdapter);的意思是:
1、把數據映射到界面里邊。這個應該是LIST放數據的基本方式,四種Adapter自己都可以選。
2、LIST上顯示數據看,必須藉助個Adapter也就是適配器,可以理解為映射也行。
H. 在android中 List 和ArrayList的區別,越詳細越好
List是一個介面,而ArrayList是List的一個實現類,對於android和J2SE來講,兩者之間的區別不大。
I. android level-list怎麼使用
只需要循環一下,判斷即可。 示例代碼: 1.遍歷整個list集合 for(int i=0; i<list.size(); i++){ } 2.在for循環中增加判斷代碼 if(list.get(i).equals("指定")){} 3.得到每一個item進行判斷即可。