最近做的項目界面太複雜,不過後來發現可以用listview來簡化xml代碼量,但是後來發現雖然都是一條一條的界面顯示內容,但是不是每一條都是一樣的風格,所以就有了如題目一樣的思考。嗯,直接把效果圖展示出來吧,功能我還真沒寫,這只是一個測試的DEMO。不過思想已經表達很清晰了。
這是一個測試DEMO,所以按鍵功能等都沒有寫,就簡單驗證可以響應。
好吧,我們談程序。我們分兩步實現我們的功能,第一步實現同一種風格的item,只是這個item有很多控件;第二步實現不同風格的item。第一步很好做到,重寫一個adapter,在我們重寫的這個類裏,我們把裏面的getView方法覆蓋掉,也就是按照我們設計的item上應該有多少控件都寫到這裏面來,因爲listview的顯示都是通過這個來設置View的,也就是getView參數中的第二個來設置View顯示出每一個item的。參考下面代碼:
/**
* 實現了一個適配器,用來顯示自定義listview,這樣的listview的每一個item都有很多控件,
* 每個控件也都能有自己的響應
*
* @author Tortoise
*
*/
public class MyItemAdapter extends BaseAdapter {
private Context context = null;
private List<Map<String, Object>> mData;
public MyItemAdapter(Context context, List<Map<String, Object>> data) {
// TODO Auto-generated constructor stub
this.context = context;
this.mData = data;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mData.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
// @Override
// public int getViewTypeCount() {
// // TODO Auto-generated method stub
// return 2;
// }
//
// @Override
// public int getItemViewType(int position) {
// // TODO Auto-generated method stub
// if(mData.get(position).get("title").toString().charAt(0)=='S'){
// return 0;
// }else{
// return 1;
// }
// }
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder viewHolder = null;
// ViewHolderOther viewHolderOther = null;
// if(getItemViewType(position)==0){
if(convertView == null){
viewHolder = new ViewHolder();
LayoutInflater layoutInflater = LayoutInflater.from(context);
convertView = layoutInflater.inflate(R.layout.lineinspection_listview_item, null);
viewHolder.tv = (TextView)convertView.findViewById(R.id.tv_listview_item);
viewHolder.et = (EditText)convertView.findViewById(R.id.et_listview_item);
viewHolder.add = (Button)convertView.findViewById(R.id.btnadd_listview_item);
viewHolder.sub = (Button)convertView.findViewById(R.id.btnsub_listview_item);
viewHolder.remark = (Button)convertView.findViewById(R.id.btnremark_listview_item);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder)convertView.getTag();
}
viewHolder.tv.setText(mData.get(position).get("title").toString().substring(1));
viewHolder.et.setText(mData.get(position).get("info").toString());
viewHolder.add.setOnClickListener(new MyListener(position, 0));
viewHolder.sub.setOnClickListener(new MyListener(position, 1));
viewHolder.remark.setOnClickListener(new MyListener(position, 2));
// }else {
// if(convertView == null){
// viewHolderOther = new ViewHolderOther();
// LayoutInflater layoutInflater = LayoutInflater.from(context);
//
// convertView = layoutInflater.inflate(R.layout.lineinspection_listview_itemother, null);
//
// viewHolderOther.tv = (TextView)convertView.findViewById(R.id.tv_listview_itemother);
// viewHolderOther.et = (EditText)convertView.findViewById(R.id.et_listview_itemother);
// viewHolderOther.remark = (Button)convertView.findViewById(R.id.btnadd_listview_itemother);
//
// convertView.setTag(viewHolderOther);
// }else{
// viewHolderOther = (ViewHolderOther)convertView.getTag();
// }
//
// viewHolderOther.tv.setText(mData.get(position).get("title").toString());
// viewHolderOther.et.setText(mData.get(position).get("info").toString());
// viewHolderOther.remark.setOnClickListener(new MyListener(position, 2));
// }
return convertView;
}
//Button響應
private class MyListener implements OnClickListener{
private int position;
private int serial;
public MyListener(int position, int serial) {
// TODO Auto-generated constructor stub
this.position = position;
this.serial = serial;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (serial) {
case 0:
Toast.makeText(context, "第"+position+"行的第一個按鈕", Toast.LENGTH_SHORT).show();
break;
case 1:
Toast.makeText(context, "第"+position+"行的第二個按鈕", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(context, "第"+position+"行的第三個按鈕", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
/**
* 對應每一個item的控件
* @author Tortoise
*
*/
private static class ViewHolder{
TextView tv;
EditText et;
Button add;
Button sub;
Button remark;
}
// private static class ViewHolderOther{
// TextView tv;
// EditText et;
// Button remark;
// }
}
MyItemAdapter的構造函數我傳入兩個參數,第一個是上下文,是必備的;第二個是數據源,我們都知道也就是我們要顯示的數據,只是我這裏數據我存在一個list裏面,是一樣的。重點看getView這個函數,這個函數重寫了父類方法,讓每一個item加載的顯示都是我定義的一個xml,這個xml裏我把我要的控件都加進去了。同時,還要對控件進行響應,比方說按鈕要添加監聽等,其實思路很簡單,也很好理解。
上面就實現了同一種風格的item的listview,那不同風格的差異在哪裏呢?其實我們想想肯定是對應不同的item我們加載不同的xml,對不同的xml實現不同的響應而已。事實也的確如此。但是我們除了要做第二套風格的item的xml之外,還要重寫兩個函數,一個是getViewTypeCount,這個是獲取有幾種風格的item;另一個是getItemViewType,這個是設置不同item對應不同風格。這個理解好理解,但是我們怎麼知道我們那個要設置成什麼樣的風格呢?我這裏提供了一個簡單的思路,比方說我給第一種風格的item的數據源都加上一個字符“S”,這樣我就可以每次設置風格的時候先獲取數據源的第一個字符,如果是“S”,我們就設置成第一種風格的item,如果不是就設置成第二種風格,同理也可以設置三種,四種以及多種的風格的item。不過這樣我們改變了數據源,這不是問題,我們加載數據源顯示的時候,把我們人爲加上去的字符去掉就可以了。
代碼我就不貼了,把上面的代碼中的註釋去掉就行了。
我的工程可以在這裏下載:http://download.csdn.net/detail/u012321815/8533743