listview不同風格item的實現

         最近做的項目界面太複雜,不過後來發現可以用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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章