开发中GridView常见问题
2016-05-18 10:19
190 查看
昨天解决了几个bug,所以记录一下,关于GridView的一些常见问题及解决方法
1,ScrollView中嵌套GridView,ListView只显示一行的问题
描述: 界面需要用ScrollView, 里面一般需要出现Gridview, 但是GridView只会显示一行,同理, Listview在ScrollView中的时候也只会显示一行
原因:在Android中,有两个ScrollView型的控件不能相互嵌套,而ListVeiw和GridView都是ScrollView型的控件,因为嵌套后,两个控件的滑动效果就丧失了,同时被嵌套控件的高度也就被限定为了一行的高度,当然,这个方法是可以解决的
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; }
相关文章推荐
- 344. Reverse String
- 每秒处理10万订单乐视集团支付架构
- 跨域Ajax请求时是否带Cookie的设置
- 链表翻转
- Unity3D总结
- MJExtension使用指导(转)
- saltstack[5]-grains
- 让你真正的理解Hash
- 测试你的Service
- 学习笔记--设计模式之工厂模式
- jquery
- 大型互联网架构概述
- 下拉刷新-上拉加载
- LeetCode 036 Valid Sudoku
- Android Segmented RadioButton
- 选择文件夹路径
- 随机数
- ufw常用命令记录
- Android中AsyncTask(异步任务)和Handler(线程消息机制)的详解
- Python特殊语法:filter、map、reduce、lambda