首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 自定義 ArrayAdapter 崩潰排查:getCount 空指針與 View 復用陷阱

     編輯:程式設計疑難解答

崩潰現場

`getCount()` 返回 `imgs.length` 時崩潰 → `imgs` 為 `null` 或未初始化。

核心修復

  1. 構造器接收數據源:
    public MyAdapter(Context context, int resource, String[] names, int[] imgs) {
        super(context, resource);
        this.names = names;
        this.imgs = imgs;
    }
    
  2. getCount 保底:
    @Override public int getCount() {
        return imgs == null ? 0 : imgs.length;
    }
    
  3. getView 正確復用 convertView:
    @Override public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.item, parent, false);
            holder = new ViewHolder();
            holder.iv = convertView.findViewById(R.id.imageView);
            holder.tv = convertView.findViewById(R.id.textView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.iv.setImageResource(imgs[position]);
        holder.tv.setText(names[position]);
        return convertView;
    }
    static class ViewHolder { ImageView iv; TextView tv; }
    

常見錯誤對照表

錯誤寫法後果正確寫法
`inflater.inflate(R.layout.item, null)`LayoutParams 丟失,佈局參數失效`inflate(layout, parent, false)`
不使用 ViewHolder 每次 findViewById滑動卡頓,GC 頻繁ViewHolder 模式 / ViewBinding
數組未在構造器傳入NullPointerException構造器強制要求數據源

進階建議

  • **棄用 ArrayAdapter,直接繼承 BaseAdapter 或使用 RecyclerView.Adapter**,靈活度更高、強制 ViewHolder、支援動畫、分佈式負載。
  • 圖片加載用 Glide/Picasso/Coil,避免 `setImageResource` 造成主線程解碼大圖 OOM。

掌握 Adapter 三大核心(`getCount`、`getView`、數據源管理)+ ViewHolder,是 Android 列表開發的入門必修課。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved