GridView Item 大小可能不一樣,如何保持同一行的Item 高度大小相同,且GridView高度自適應!


 
        

 昨天用到GridView,但是遇到幾個問題,就是GridView默認的item其實大小是一致的,但是我們經常會遇到item大小不同,系統默認會留白的問題,很頭疼!如下圖這樣的:

 

     就會造成,右圖所示,左右大小不一致,中間還留了一塊,給人的感覺太差了!!
 
 
那如何保證GridView自適應且看起來更美觀呢? 達到這樣的效果呢??
 
度娘搜索了,google了,還是沒找到好的方法!!但是在一篇blog里得到了 一個思路,就是把GridView對象傳進到adapter 里面,然后去動態設置item的height。
 
這樣做就行:
貼出部分關鍵代碼:
 
 
        private GridView gv;

	public AtypeAdapter(GridView gv, Context context, List<AtypeEntity> list) {
		this.gv = gv;
		this.context = context;
		this.data = list;
	}

 
 GridView對象傳到對應的adapter里面,  網上很多人人也說了,得到GridVeiw的總的height,然后除以總共的Rows就可以設置所有的行的item高度一致了。但是對於GridView來說,adapter數據都沒綁定,怎么可能得到高度呢? 還有一點是,咱們的GridView的每個item的高度是不確定的,就算你算出了GridView的總高度,然后跟item的rows做除法,得到的每行的高度,得到的效果也不是想要的,因為有的item會很大,會比平局高度還大,那會顯示不全,有的item會比較小,比平均高度還小很多,會導致留白很大!效果很差!!  我的adapter的每一個item 里面包含了三個textview,textview的內容文字的長度是不固定的,所以按照平均值來寫死每個item的高度,是不理想的,也是不行的。
那怎么辦?  這么寫:
 
傳入的GridView之后,
 
 
public View getView(int position, View convertView, ViewGroup parent) {

		Holder holder;
		if (convertView == null) {
			holder = new Holder();
			convertView = View.inflate((Activity) this.context,
					R.layout.atype_adpter, null);

			holder.atype_serial_num = (TextView) convertView
					.findViewById(R.id.atype_serial_num);
			holder.atype_name = (TextView) convertView
					.findViewById(R.id.atype_name);
			holder.atype_kusercode = (TextView) convertView
					.findViewById(R.id.atype_code);
			convertView.setTag(holder);
			// 綁定listener監聽器,檢測convertview的height
                        holder.update();
		} else {
			holder = (Holder) convertView.getTag();
		}

		holder.atype_serial_num.setText((position + 1) + "");
		holder.atype_name.setText(data.get(position).getAfullname());
		holder.atype_kusercode.setText(data.get(position).getAusercode());
		// 綁定tag	
		holder.atype_kusercode.setTag(position);
		//  綁定當前的item,也就是convertview
		holder.atype_name.setTag(convertView);
		return convertView;
	}

	public class Holder {
		public TextView atype_serial_num;
		public TextView atype_name;
		public TextView atype_kusercode;

		public void update() {
			// 精確計算GridView的item高度	
			atype_kusercode.getViewTreeObserver().addOnGlobalLayoutListener(
					new OnGlobalLayoutListener() {
						public void onGlobalLayout() {
							int position = (Integer) atype_kusercode.getTag();
							// 這里是保證同一行的item高度是相同的!!也就是同一行是齊整的 height相等	
							if (position > 0 && position % 2 == 1) {
 								View v = (View) atype_name.getTag();
								int height = v.getHeight();
								
								View view = gv.getChildAt(position - 1);
								int lastheight = view.getHeight();
								// 得到同一行的最后一個item和前一個item想比較,把誰的height大,就把兩者中                                                                // height小的item的高度設定為height較大的item的高度一致,也就是保證同一                                                                 // 行高度相等即可	
								if (height > lastheight) {
									view.setLayoutParams(new GridView.LayoutParams(
											GridView.LayoutParams.FILL_PARENT,
											height));
								} else if (height < lastheight) {
									v.setLayoutParams(new GridView.LayoutParams(
											GridView.LayoutParams.FILL_PARENT,
											lastheight));
								}
							}
						}
					});
		}
	}

 這樣設定以后,adpter的同一行的item的height會相同,保證了GridView同一行的height自適應相同,美觀且舒服!!
 謝謝!
 
 
 
 
 
 

 

1
0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM