1:ContentValues 的用法,對比HashTable:
ContentValues 和HashTable類似都是一種存儲的機制 但是兩者最大的區別就在於,contenvalues只能存儲基本類型的數據,像string,int之類的,不能存儲對象這種東西,而HashTable卻可以存儲對象。
在忘數據庫中插入數據的時候,首先應該有一個ContentValues的對象所以:
ContentValues initialValues = new ContentValues();//語句實例化一個contentValues類。
initialValues.put(key,values);//語句將列名和對應的列值放置到initialValues裏邊。
SQLiteDataBase sdb ;
sdb.insert(database_name,null,initialValues);//語句負責插入一條新的紀錄,如果插入成功則會返回這條記錄的id,如果插入失敗會返回-1。
2:android中listview的優化方式
istview的優化其實就是去找getView中的耗時操作,然後提取出來,要麼使用異步的方式爲item的佈局設置數據,要是實在需要同步,就只能在Adapter初始化時將數據準備好,然後再getView中只需綁定一下就行。
listview可以說是Android開發中最常見的UI控件了,listview能夠以列表的方式顯示大量同類的數據,這樣問題就產生了,既然是大量數據,就會使用到很多佈局,給佈局綁定數據,listview將佔用大量資源還可能會產生卡頓現象。
listview現在最常用也擁有很好的性能的優化方式是在Adapter中使用靜態的ViewHolder,具體代碼如下:
private TestAdapter mAdapter; private String[] mArrData; private TextView mTV; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mTV = (TextView) findViewById(R.id.tvShow); mArrData = new String[1000]; for (int i = 0; i < 1000; i++) { mArrData[i] = "Google IO Adapter" + i; } mAdapter = new TestAdapter(this, mArrData); ((ListView) findViewById(android.R.id.list)).setAdapter(mAdapter); } Adapter private int count = 0; private long sum = 0L; @Override public View getView(int position, View convertView, ViewGroup parent) { // 開始計時 long startTime = System.nanoTime(); ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item_icon_text, null); holder = new ViewHolder(); holder.icon1 = (ImageView) convertView.findViewById(R.id.icon1); holder.text1 = (TextView) convertView.findViewById(R.id.text1); holder.icon2 = (ImageView) convertView.findViewById(R.id.icon2); holder.text2 = (TextView) convertView.findViewById(R.id.text2); convertView.setTag(holder); } else{ holder = (ViewHolder)convertView.getTag(); } holder.icon1.setImageResource(R.drawable.icon); holder.text1.setText(mData[position]); holder.icon2 .setImageResource(R.drawable.icon); holder.text2.setText(mData[position]); // 停止計時 long endTime = System.nanoTime(); // 計算耗時 long val = (endTime - startTime) / 1000L; Log.e("Test", "Position:" + position + ":" + val); if (count < 100) { if (val < 1000L) { sum += val; count++; } } else mTV.setText(String.valueOf(sum / 100L));// 顯示統計結果 return convertView; } } static class ViewHolder { TextView text1; ImageView icon1; TextView text2; ImageView icon2; }
dip: device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,這個和設備硬件有關,一般我們爲了支持WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。
dp: dip是一樣的
px: pixels(像素). 不同設備顯示效果相同,一般我們HVGA代表320x480像素,這個用的比較多。
pt: point,是一個標準的長度單位,1pt=1/72英寸,用於印刷業,非常簡單易用;
sp: scaled pixels(放大像素). 主要用於字體顯示best for textsize。
據px = dip * density / 160,則當屏幕密度爲160時,px = dip
根據 google 的建議,TextView 的字號最好使用 sp 做單位,而且查看TextView的源碼可知Android默認使用sp作爲字號單位。將dip作爲其他元素的單位。
url:http://greatverve.cnblogs.com/archive/2011/12/27/Android-dip-dp-sp-pt-px.html
4:java構造函數能否被繼承,爲什麼?
不能,因爲子類繼承父類的時候,先運行父類構造函數;具體的說就是運行父類時就會先“調用”父類的構造函數,注意“調用”和繼承不是一個含義,實質上是“自動運行”。
繼承(extends)的含義其實是“擴展”,子類完全沒必要擴展父類的構造函數,因爲反正每次調子類的時候都會“自動運行”它父類的構造函數,如果真的需要子類構造函數特殊的形式,子類直接修改或重載自己的構造函數就好了。
估計是你對“構造函數”的意義本身不理解,“調用”一個類有“繼承”和“組合(說白了new 一個類)”兩種方式,當你“調用”一個類的時候就會“自動運行”它的“構造函數”。
這樣理解更好 class Person{ Person() { System.out.println("父類構造函數"); } Person(int a) { System.out.println("帶參數的父類構造函數"); } } public class Test extends Person { public Test() { System.out.println("子類構造函數"); } public Test(int a) { Person(12);//錯誤吧 只能用super(12)吧,如果能繼承的話就應該可以寫成Person(12); System.out.println("帶參數的子類構造函數"); } public static void main(String[] args) { Test a=new Test(12); } }