给GridView设置行高
近期在工作中遇到了這樣一個(gè)問題,使用一個(gè)GridView展示數(shù)據(jù),item中僅僅是一個(gè)TextView,可是里面顯示的文字多少不固定多少,必須所有展示出來.
遇到的問題:
?1.把item中的寬和高設(shè)置match_parent,還是設(shè)置成wrap_content,當(dāng)內(nèi)容過多的時(shí)候,會(huì)覆蓋下一行的顯示的內(nèi)容.
?2.沒有一個(gè)屬性能夠給GridView設(shè)置行高,那么高度就不能控制.
遇到的問題展示:.期望
想到的解決的方法是:
? ?設(shè)計(jì)思路:1.先把TextView的高度,獲取出來
? ? 2.把高度存到全局變量中,然后進(jìn)行和原來的比較,把大的存到全局變量中
? ? 3.然后再把全局變量中的高度設(shè)置給TextView
如今明確了思路,以下就開始理解代碼.
?先創(chuàng)建一個(gè)activity_main.xml
<span style="font-family:SimSun;font-size:18px;"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><GridViewandroid:id="@+id/mygridview"android:layout_width="match_parent"android:layout_height="match_parent"android:horizontalSpacing="10dp"android:verticalSpacing="10dp" /></RelativeLayout></span>
<span style="font-family:SimSun;font-size:18px;">package com.example.gridviewdemo;import java.util.ArrayList; import java.util.List;import android.app.Activity; import android.os.Bundle; import android.widget.GridView;public class MainActivity extends Activity {private GridView mygridview;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();}private void initView() {mygridview = (GridView) findViewById(R.id.mygridview);mygridview.setNumColumns(Constant.GRIVEW_COLUMN_NUMS);}/*** * @方法名稱:initData* @描寫敘述: TODO* @創(chuàng)建人:yzk* @創(chuàng)建時(shí)間:2014年10月15日 下午2:17:28* @備注:初始化數(shù)據(jù)* @返回類型:void*/private void initData() {List<String> list = new ArrayList<String>();list.add("新聞");list.add("體育");list.add("娛樂");list.add("我愛探險(xiǎn)");list.add("123");list.add("我愛騎車旅游");list.add("相信自己,萬事開頭難,我的地盤我做主");list.add("珍愛生命,人人有責(zé)");list.add("come baby");list.add("2002年的第一場雪");list.add("冬天的一把火");mygridview.setAdapter(new MyAdapter(MainActivity.this, list));}} </span>
以下是全局變量類.
Constant
<span style="font-family:SimSun;font-size:18px;">package com.example.gridviewdemo;public class Constant {public static int GRIVIEW_COLUMN_HEIGHT = 0;// griview設(shè)置的高度public static int GRIVEW_COLUMN_NUMS = 4;// 列數(shù) } </span>
創(chuàng)建GriView的適配器
<span style="font-family:SimSun;font-size:18px;">public class MyAdapter extends BaseAdapter {private Context mContext;private List<String> mdata;public MyAdapter(Context mContext, List<String> data) {super();this.mContext = mContext;this.mdata = data;}@Overridepublic int getCount() {if (mdata == null) {return 0;}return mdata.size();}@Overridepublic Object getItem(int position) {return mdata.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {holder = new ViewHolder();convertView = View.inflate(mContext, R.layout.item_griview, null);holder.item = (TextView) convertView.findViewById(R.id.item);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}initKeyTextView(holder.item,position);holder.item.setText((String)getItem(position));return convertView;}class ViewHolder {TextView item;}/*** * @方法名稱:initKeyTextView* @描寫敘述: TODO* @創(chuàng)建人:yzk* @創(chuàng)建時(shí)間:2014年10月15日 上午11:58:22* @備注:獲取高度每一個(gè)textview的高度,然后進(jìn)行比較,把最高的設(shè)置為TextView的高度* @param ll* @param position* @返回類型:void* @注意點(diǎn):1,要把獲取的item中TextView的高度存放到全局變量中,這樣才會(huì)其作用. * 2.一定要在addOnGlobalLayoutListener監(jiān)聽器中給TextView設(shè)置高度,* 禁止把高度取出,然后在getView中這僅僅高度,這樣是無效的* @設(shè)計(jì)思路:1.先把TextView的高度,獲取出來* 2.把高度存到全局變量中,然后進(jìn)行和原來的比較,把大的存到全局變量中* 3.然后再把全局變量中的高度設(shè)置給TextView*/public void initKeyTextView(final View ll, final int position) {ViewTreeObserver vto2 = ll.getViewTreeObserver();vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {ll.getViewTreeObserver().removeGlobalOnLayoutListener(this);if (position % Constant.GRIVEW_COLUMN_NUMS == 0) {Constant.GRIVIEW_COLUMN_HEIGHT = 0;}if (ll.getHeight() > Constant.GRIVIEW_COLUMN_HEIGHT) {Constant.GRIVIEW_COLUMN_HEIGHT = ll.getHeight();}setHeight(ll, Constant.GRIVIEW_COLUMN_HEIGHT);}});}public void setHeight(View ll, int height) {ll.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, height,Gravity.CENTER));} }</span>
注意點(diǎn):
? ? ? 1,要把獲取的item中TextView的高度存放到全局變量中,這樣才會(huì)其作用.?
? ? ? 2.一定要在addOnGlobalLayoutListener監(jiān)聽器中給TextView設(shè)置高度,
? ? ?禁止把高度取出,然后在getView中這僅僅高度,這樣是無效的,(取出的是0,或許源碼中用final修飾了, ? ? ? ? ? ? ?詳細(xì)的原因還不清楚,請(qǐng)高手,請(qǐng)給指點(diǎn)一下)
此方法中
?在上面用到了ViewTreeObserver動(dòng)態(tài)的獲取view的高度,假設(shè)想了解其它動(dòng)態(tài)方法,請(qǐng)點(diǎn)擊
?源代碼下載:http://download.csdn.net/detail/forwardyzk/8041089
? 大家互相探討,互相進(jìn)步.
轉(zhuǎn)載于:https://www.cnblogs.com/wzjhoutai/p/6852182.html
總結(jié)
以上是生活随笔為你收集整理的给GridView设置行高的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内置对象和自定义对象的原型链
- 下一篇: WINFORM 调用 Close 不会释