您的位置:首页 > 其它

开发中GridView常见问题

2016-05-18 10:19 190 查看
昨天解决了几个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[/code] 
这就是一个明显的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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: