复现Android中GridView的bug并办理

诗林  高级会员 | 2024-7-25 04:34:40 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 227|帖子 227|积分 681

几年前的一个bug,GridView的item高度差别等。如下图:
复现bug的代码:
  1. import android.os.Bundle;
  2. import android.widget.BaseAdapter;
  3. import android.widget.GridView;
  4. import androidx.appcompat.app.AppCompatActivity;
  5. import java.util.ArrayList;
  6. public class MainActivity extends AppCompatActivity {
  7.     private GridView grid_photo;
  8.     private BaseAdapter mAdapter = null;
  9.     private ArrayList<String> mData = null;
  10.     @Override
  11.     protected void onCreate(Bundle savedInstanceState) {
  12.         super.onCreate(savedInstanceState);
  13.         setContentView(R.layout.activity_main);
  14.         grid_photo = (GridView) findViewById(R.id.grid_photo);
  15.         mData = new ArrayList<String>();
  16.         mData.add( "鸡腿汉堡 x 1");
  17.         mData.add( "韩国牛排(7分熟、不放辣)x 3");
  18.         mData.add( "小杯可乐");
  19.         mData.add( "薯条");
  20.         mData.add( "冰淇淋");
  21.         mData.add( "红茶");
  22.         mData.add( "披萨");
  23.         mAdapter = new MyAdapter<String>(mData, R.layout.item_grid_icon) {
  24.             @Override
  25.             public void bindView(ViewHolder holder, String obj) {
  26.                 holder.setText(R.id.txt_icon, obj);
  27.             }
  28.         };
  29.         grid_photo.setAdapter(mAdapter);
  30.     }
  31. }
  32. //activity_main.xml
  33. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  34.     xmlns:tools="http://schemas.android.com/tools"
  35.     android:layout_width="match_parent"
  36.     android:layout_height="match_parent"
  37.     android:padding="5dp"
  38.     tools:context=".MainActivity">
  39.     <!--numColumns设置每行显示多少个-->
  40.     <GridView
  41.         android:id="@+id/grid_photo"
  42.         android:layout_width="match_parent"
  43.         android:layout_height="match_parent"
  44.         android:horizontalSpacing="2dp"
  45.         android:verticalSpacing="2dp"
  46.         android:gravity="center"
  47.         android:numColumns="2" />
  48. </RelativeLayout>
  49. //MyAdapter.java
  50. import android.content.Context;
  51. import android.util.SparseArray;
  52. import android.view.LayoutInflater;
  53. import android.view.View;
  54. import android.view.ViewGroup;
  55. import android.widget.BaseAdapter;
  56. import android.widget.ImageView;
  57. import android.widget.TextView;
  58. import java.util.ArrayList;
  59. public abstract class MyAdapter<T> extends BaseAdapter {
  60.     private ArrayList<T> mData;
  61.     private int mLayoutRes;           //布局id
  62.     public MyAdapter() {
  63.     }
  64.     public MyAdapter(ArrayList<T> mData, int mLayoutRes) {
  65.         this.mData = mData;
  66.         this.mLayoutRes = mLayoutRes;
  67.     }
  68.     @Override
  69.     public int getCount() {
  70.         return mData != null ? mData.size() : 0;
  71.     }
  72.     @Override
  73.     public T getItem(int position) {
  74.         return mData.get(position);
  75.     }
  76.     @Override
  77.     public long getItemId(int position) {
  78.         return position;
  79.     }
  80.     @Override
  81.     public View getView(int position, View convertView, ViewGroup parent) {
  82.         ViewHolder holder = ViewHolder.bind(parent.getContext(), convertView, parent, mLayoutRes
  83.                 , position);
  84.         bindView(holder, getItem(position));
  85.         return holder.getItemView();
  86.     }
  87.     public abstract void bindView(ViewHolder holder, T obj);
  88.    
  89.     public static class ViewHolder {
  90.         private SparseArray<View> mViews;   //存储ListView 的 item中的View
  91.         private View item;                  //存放convertView
  92.         private int position;               //游标
  93.         private Context context;            //Context上下文
  94.         //构造方法,完成相关初始化
  95.         private ViewHolder(Context context, ViewGroup parent, int layoutRes) {
  96.             mViews = new SparseArray<>();
  97.             this.context = context;
  98.             View convertView = LayoutInflater.from(context).inflate(layoutRes, parent, false);
  99.             convertView.setTag(this);
  100.             item = convertView;
  101.         }
  102.         //绑定ViewHolder与item
  103.         public static ViewHolder bind(Context context, View convertView, ViewGroup parent,
  104.                                       int layoutRes, int position) {
  105.             ViewHolder holder;
  106.             if (convertView == null) {
  107.                 holder = new ViewHolder(context, parent, layoutRes);
  108.             } else {
  109.                 holder = (ViewHolder) convertView.getTag();
  110.                 holder.item = convertView;
  111.             }
  112.             holder.position = position;
  113.             return holder;
  114.         }
  115.         @SuppressWarnings("unchecked")
  116.         public <T extends View> T getView(int id) {
  117.             T t = (T) mViews.get(id);
  118.             if (t == null) {
  119.                 t = (T) item.findViewById(id);
  120.                 mViews.put(id, t);
  121.             }
  122.             return t;
  123.         }
  124.         /**
  125.          * 设置文字
  126.          */
  127.         public ViewHolder setText(int id, CharSequence text) {
  128.             View view = getView(id);
  129.             if (view instanceof TextView) {
  130.                 ((TextView) view).setText(text);
  131.             }
  132.             return this;
  133.         }
  134.     }
  135. }
  136. //item_grid_icon.xml
  137. <?xml version="1.0" encoding="utf-8"?>
  138. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  139.     android:layout_width="match_parent"
  140.     android:layout_height="match_parent"
  141.     android:background="#00ff00"
  142.     android:padding="5dp">
  143.     <TextView
  144.         android:id="@+id/txt_icon"
  145.         android:layout_width="wrap_content"
  146.         android:layout_height="wrap_content"
  147.         android:layout_centerVertical="true"
  148.         android:layout_centerHorizontal="true"
  149.         android:layout_marginTop="30dp"
  150.         android:text="呵呵"
  151.         android:textSize="18sp" />
  152. </RelativeLayout>
复制代码
下一篇:android Gridview item高度顺应行最大高度问题,讲办理方案。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

诗林

高级会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表