昨天解决了几个bug,所以记录一下,关于GridView的一些常见问题及解决方法
1,ScrollView中嵌套GridView,ListView只显示一行的问题
描述: 界面需要用ScrollView, 里面一般需要出现Gridview, 但是GridView只会显示一行,同理, Listview在ScrollView中的时候也只会显示一行
原因:在Android中,有两个ScrollView型的控件不能相互嵌套,而ListVeiw和GridView都是ScrollView型的控件,因为嵌套后,两个控件的滑动效果就丧失了,同时被嵌套控件的高度也就被限定为了一行的高度,当然,这个方法是可以解决的
解决方法:自定义GridView和ListView
重写ListView
- public class MyListView extends ListView {
- public MyListView(Context context) {
- // TODO Auto-generated method stub
- super(context);
- }
- public MyListView(Context context, AttributeSet attrs) {
- // TODO Auto-generated method stub
- super(context, attrs);
- }
- public MyListView(Context context, AttributeSet attrs, int defStyle) {
- // TODO Auto-generated method stub
- super(context, attrs, defStyle);
- }
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- // TODO Auto-generated method stub
- int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
- MeasureSpec.AT_MOST);
- super.onMeasure(widthMeasureSpec, expandSpec);
- }
- }
重写GridView
- /**
- * 自定义gridview,解决ListView中嵌套gridview显示不正常的问题(1行半)
- * @author wangyx
- * @version 1.0.0 2012-9-14
- */
- public class MyGridView extends GridView{
- public MyGridView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- public MyGridView(Context context) {
- super(context);
- }
- public MyGridView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
- @Override
- public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
- MeasureSpec.AT_MOST);
- super.onMeasure(widthMeasureSpec, expandSpec);
- }
- }
2,GridView 抢焦点的问题
描述: 当一个界面有GridView的时候,界面总会先展示GridView,例如当一个界面用ScrollView包裹,GridView在最下方,但是界面打开的时候会跳到最下方展示,这样非常别扭,这还不是最重要的,请参看 我遇到的实际问题 http://bbs.csdn.net/topics/391949315
这就是一个明显的GridView抢焦点的问题,虽然没有得到答案但是至少知道原因了,这样就好解决了
方法:在GridView所在的跟节点设置 android: descendantFocusability 这个属性
属性的值有三种: beforeDescendants:viewgroup会优先其子类控件而获取到焦点 afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点 blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
3,GridView的item宽高设置问题
描述:经常设置GridView的时候发现在item中确定的宽高都没有用,遇到便知
原因:这个问题的关键在adapter的getView方法中,需要在该方法中指定宽高才可以
解决方法:
@Override public View getView(int position, View convertView, ViewGroup parent) { View view; ViewHolder holder; if (convertView == null) { view = View.inflate(context, R.layout.item_invite_joiner_head, null); //指定Item的宽高 DisplayMetrics dm = new DisplayMetrics(); ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm); float density = dm.density; // int width = (int) (80 * density); int hight = (int) (84 * density); view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, hight)); holder = new ViewHolder(view); view.setTag(holder); } else { view = convertView; holder = (ViewHolder) view.getTag(); } int acceptType = getItem(position).getAcceptType(); if (1 == acceptType) { holder.mItemInviteAgreeIv.setVisibility(View.VISIBLE); } else { holder.mItemInviteAgreeIv.setVisibility(View.INVISIBLE); } String url = getItem(position).getLogo(); holder.mItemInviteAgreeIv.setTag(url); if (holder.mItemInviteHeadIv.getTag() != null && holder.mItemInviteHeadIv.getTag().equals(url)) { HttpLoader.getImageLoader().get(url, ImageLoader.getImageListener(holder.mItemInviteHeadIv, R.drawable.picture_moren, R.drawable.picture_moren)); ALog.i("url的地址为" + url); } return view; }