剛完成了一個課程設計,手機客戶端加服務端,在寫android程序的時候,基本上不清楚的都是google的,還有些難題是直接跑國外論壇,一個課程設計下來,收穫確實蠻多的,但是過後再去看一些知識點的時候,才發現開發中遇到的一些問題其實都是一些基本的問題,以前也都學到過,但是沒用就忘了,很多實現其實有很簡單的方法,有最合適的官方包裝,但是由於不熟悉,導致代碼冗餘度太大,主要是浪費了很多時間,出力不討好啊,所以就打算總結一下,什麼時候用的時候,知道是什麼知識,該用什麼方法去實現。
listview佈局文件中常用的屬性
ListView的實現可以在xml文件中添加<ListView>組件,也可以直接繼承ListView類,要顯示內容,在xml佈局文件中可以直接android:entries="@array/books"引用一個數組資源顯示其內容,當然大部分顯示都是用adapter。
在listview中常用的四個adapter類:ArrayAdapter,SImpleAdapter,SImpleCursorAdapter,BaseAdapter,其中前三個都是BaseAdapter的子類,對BaseAdapter做了特定的擴展,用BaseAdapter可以做到自定義的擴展。
String[] strs = {"小紅帽", "大灰狼", "新概念"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, strs);
ArrayAdapter的第二個參數是一個資源ID,該資源代表一個TextView,這裏用的是系統自帶的佈局,也可以使用自定義的textview的xml。當然也可以指定某一佈局中的一個TextView組件,如下代碼:
listView.setAdapter(new ArrayAdapter<String>(
MainActivity.this,
R.layout.show,
R.id.textView,
data));
public SimpleAdapter(Context context, List<? extends Map<String, ?>> data,
int resource, String[] from, int[] to)
SimpleAdapter的構造方法只此一個,小例子如下:
ListView lv = (ListView) findViewById(R.id.listView1);
String[] from = { "Text", "Button" };
int[] to = { R.id.text, R.id.button };
List<Map<String, ?>> list = new ArrayList<Map<String, ?>>();
for (int i = 0; i < 10; i++) {
Map<String, String> m = new HashMap<String, String>();
m.put("Text", "Text" + i);
m.put("Button", "Button" + i);
list.add(m);
}
SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.listitem, from, to);
lv.setAdapter(adapter);
SimpleCursorAdapter主要是用於顯示cursor裏面的內容,小例子如下:
setContentView(R.layout.main);
Cursor cursor = getContentResolver().query(Location.CONTENT_URI, mLocationProjection,
null, null, null);
//from跟to,非常有趣,把什麼值顯示在什麼控件上。,是一個數組,支持多個綁定
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.provice_list_item, cursor,
new String[] {Location.PROVICE, Location.CITY },
new int[] { R.id.princeTextView,android.R.id.text1 });
//給listview設置cursor有很多種方式,這是最簡單的方式
setListAdapter(adapter);
BaseAdapter標準模板:
class ListOrdersAdapter extends BaseAdapter {
private LayoutInflater inflater;
private List<OrderBean> orderList;
public ListOrdersAdapter(Context context, List<OrderBean> orderList) {
inflater = LayoutInflater.from(context);
this.orderList = orderList;
}
@Override
public int getCount() {
System.out.println("getCount----------"+orderList.size());
return orderList.size();
}
@Override
public Object getItem(int position) {
return orderList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("++++++++++++++++++++"+position);
ViewHolder viewHolder;
if(convertView == null){
convertView = inflater.inflate(R.layout.ordershow, null);
viewHolder = new ViewHolder();
viewHolder.orderId = (TextView)convertView.findViewById(R.id.show_order_id);
viewHolder.orderCus = (TextView)convertView.findViewById(R.id.show_order_cus);
viewHolder.orderDate = (TextView)convertView.findViewById(R.id.show_order_date);
convertView.setTag(viewHolder);
}else {
viewHolder = (ViewHolder)convertView.getTag();
}
String strOrderId = orderList.get(position).getOrderNum();
String strOrderCus = orderList.get(position).getOrderCusName();
String strOrderDate = orderList.get(position).getOrderDate();
System.out.println(strOrderId+" "+strOrderCus+" "+strOrderDate);
viewHolder.orderId.setText(strOrderId);
viewHolder.orderCus.setText(strOrderCus);
viewHolder.orderDate.setText(strOrderDate);
return convertView;
}
}
static class ViewHolder {
TextView orderId;
TextView orderCus;
TextView orderDate;
}
下一篇文章將詳細解釋,在BaseAdapter中爲什麼要用ViewHolder