首页 > 其他分享 >GridView 同行item高度不一致问题

GridView 同行item高度不一致问题

时间:2023-04-27 16:12:39浏览次数:28  
标签:GridView cellImage height item convertView holder 同行

GridView 同行item高度不一致问题

//bug 场景:item高度不一致,存在留白间隙

 

解决办法:

将GridView 添加到它本身的适配器当中,新增ViewHolder(目的是在GridView 初始化完成后,适配器方便操作GridView,直接在适配器getView方法中对converView进行操作),计算GridView高度,并设置GridView同一行的item高度保持一致。完整代码如下:

public class GridAdapter extends SimpleAdapter {
   Context mContext;
   LayoutInflater inflater;
   GridView gv;

   private ArrayList<HashMap<String, Object>> listData = new ArrayList();
/*构造方法中新增gridview,并初始化*/
   public GridAdapter(Context context, GridView gv,List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {
       super(context, data, resource, from, to);
       this.mContext = context;
       inflater = LayoutInflater.from(context);
       listData = (ArrayList)data;
       this.gv = gv;
  }
   //GridView适配时调用getView方法
     @Override
   public View getView(int position, View convertView, ViewGroup parent) {
       Log.d("oy", "getViewOne");
       Holder holder;
       if (convertView==null){
           convertView = inflater.inflate(R.layout.grid_cell, null);
           holder = new Holder(convertView);
           holder.cellLabel = convertView.findViewById(R.id.cellLabel);
           holder.cellImage = convertView.findViewById(R.id.cellImage);
           convertView.setTag(holder);
           //绑定监听器,检测convertView的高度
           holder.update(); //view初始化完成后更新修改
      }else {
           holder = (Holder) convertView.getTag();
      }
       HashMap<String, Object> map = (HashMap)listData.get(position);
       holder.cellImage.setImageResource(((Integer)map.get("cellImage")).intValue());
       holder.cellLabel.setText(String.valueOf(map.get("cellLabel")));
       holder.cellLabel.setTag(convertView);
       holder.cellImage.setTag(position);

       return convertView;
  }
   
   
   //自定义View Holder内部类,解决view尚未初始化完成,无法操控的问题
       public class  Holder {
       public ImageView cellImage;
       public TextView cellLabel;

       public Holder(@NonNull View itemView) {
           cellImage = itemView.findViewById(R.id.cellImage);
           cellLabel = itemView.findViewById(R.id.cellLabel);
      }
           //main 计算GridView 对应item的高度,解决GridView 同行item不一致的问题
       public void update() {
           // 精确计算GridView的item高度
           cellImage.getViewTreeObserver().addOnGlobalLayoutListener(
                   new ViewTreeObserver.OnGlobalLayoutListener() {
                       public void onGlobalLayout() {
                           int position = (Integer) cellImage.getTag();
                           cellImage.getTag();
                           // 这里是保证同一行的item高度是相同的!!也就是同一行是齐整的 height相等
                           if (position > 0 && position % 2 == 1) {
                               View v = (View) cellLabel.getTag();
                               int height = v.getHeight();
                               Log.d("oy", "height==" + height);
                               View view = gv.getChildAt(position - 1);
                               int lastheight = view.getHeight();
                               Log.d("oy", "lastHeight==" + lastheight);
                               // 得到同一行的最后一个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));
                              }
                          }
                      }
                  });
      }
  }
}
   

标签:GridView,cellImage,height,item,convertView,holder,同行
From: https://www.cnblogs.com/a-n-yan/p/17359228.html

相关文章

  • Java代码虾皮item_search-根据关键词获取商品列表 API 接口(title商品标题、pic_url宝
     Shopee是东南亚最大的电商平台之一。Shopee拥有商品种类,包括电子消费品、家居、美容保健、母婴、服饰及健身器材等。做好shopee店铺需要注意以下几点:1.选择优质的产品2.每日上新产品3.营销策略4.引流策略5.发货的地点Java代码操作示例importjava.io.BufferedReader;impo......
  • 20230425001 - DataGridView绑定了数据之后, 再添加CheckBox列的解决方案
                 DataGridViewCheckBoxColumncheckBoxColumn=newDataGridViewCheckBoxColumn();           checkBoxColumn.Name="select";           checkBoxColumn.HeaderText="选择";           dgv_M.Columns.Inse......
  • API接口item_get-获取lazada商品详情(num_iid宝贝ID、title商品标题、price价格、nick
    什么是API?API是一个缩写,它代表了一个pplicationPAGC软件覆盖整个房间。API是用于构建软件应用程序的一组例程,协议和工具。API指定一个软件程序应如何与其他软件程序进行交互。例行程序:执行特定任务的程序。例程也称为过程,函数或子例程。协议:在两个系统之间传输数据的格式。......
  • 手把手教你进行Scrapy中item类的实例化操作
     接下来我们将在爬虫主体文件中对Item的值进行填充。1、首先在爬虫主体文件中将Item模块导入进来,如下图所示。2、第一步的意思是说将items.py中的ArticleItem类导入到爬虫主体文件中去,将两个文件串联起来,其中items.py的部分内容如下图所示。3、将这个ArticleItem类导入之后,接下来......
  • Java获取拼多多搜索词推荐 API接口(item_search_suggest-获得搜索词推荐)
    搜索词推荐的作用1.可以精准把控流量2.可以测试产品款式测试产品图片3.提升类目在平台的排名4.提升销量,加速报名参加平台的活动5.提升ROI,日常平销item_search_suggest-获得搜索词推荐公共参数名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥(接......
  • AntdPro中formItemProps和fieldProps的区别
    title:AntdPro中formItemProps和fieldProps的区别date:2023-04-1312:50:23tags:["React","AntDesign"]categories:["前端篇"]最近在工作中接触到了antd和antdpro,作为一个react和antd新人,在学习和使用中遇到了不少的问题,下边就常见的一个问题来进行记录,后......
  • 【快应用】list-item组件的正确隐藏
    【关键词】list组件 if/show 【问题背景】list组件中给list-item使用show属性后,再设置为false后,会有一个空白位置留出,感觉位置好像还是被占据着,这种情形我们该如何处理?如下图所示:​​ 【问题原因】引擎list组件的实现就是这样的,show为false时只是将控件设置为隐藏,dom......
  • Winform DataGridView使用最佳方法
    一般使用到DataGridView控件的都是涉及到多数据显示及更改。非数据库最好使用一个类写个model:internalclassDataModel{publicintid{get;set}publicstringname{get;set}publicstringtel{get;set}…… } 然后在DataGridView数据绑定此对象重新加载数据的时候......
  • C#中使用DataGridView显示二维数组中的内容
    https://blog.csdn.net/jasonleesjtu/article/details/7555514int[,]TABLE=newint[,]{{1,2,3},{4,5,6}};DataTabledt=newDataTable();for(inti=0;i<TABLE.GetLength(1);i++)dt.Columns.Add(i.ToS......
  • 【批处理】powershell RMDIR删除文件夹及文件报错,Remove-Item: A positional paramet
    1、场景  由于测试导致的缓存文件较多,需要删除,手动删除太慢,所以直接用命令删除 2、报错备注:没装powershell的电脑可以用的  3、处理方法cmd--%/cRMDIR/Q/SC:\Users\ADMINI~1\AppData\Local\Temp参数解释:--%,停止解析符号,告诉PowerShell停止解析其余参数,并......