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

Fragment 中 ListView 無資料顯示?Adapter getCount() 回傳 0 是主因

     編輯:程式設計綜合問答

問題現象

在 Fragment 中使用自訂 BaseAdapter 綁定 ListView,執行後畫面空白,資料完全不顯示。

錯誤程式碼

@Override
public int getCount() {
    data.size(); // 僅呼叫 size(),未回傳
    return 0;    // 永遠回傳 0
}

原因分析

getCount() 決定 ListView 要繪製多少列。回傳 0 表示「沒有資料」,因此 getView() 根本不會被呼叫,自然什麼都不會畫。

修正方法

@Override
public int getCount() {
    return data.size(); // 直接回傳資料筆數
}

其他潛在問題檢查清單

  • getItem(int position) 應回傳 data.get(position),而非 position。
  • getItemId(int position) 建議回傳穩定 ID(如資料表主鍵),單純回傳 position 在資料異動時可能導致動畫錯誤。
  • getView() 中應實作 ViewHolder 模式 並善用 convertView 回收,避免重複 inflate 造成卡頓。
  • 確認 R.layout.list_row 中的 TextView ID(contact_name, phone_number)與程式碼 findViewById 一致。

完整修正後的 Adapter 範例

private class ContactsAdapter extends BaseAdapter {
    private final LayoutInflater inflater;
    private final List<Custom> data;

    public ContactsAdapter(Context context, List<Custom> data) {
        this.inflater = LayoutInflater.from(context);
        this.data = data;
    }

    @Override public int getCount() { return data.size(); }
    @Override public Custom getItem(int position) { return data.get(position); }
    @Override public long getItemId(int position) { return data.get(position).hashCode(); }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_row, parent, false);
            holder = new ViewHolder();
            holder.name = convertView.findViewById(R.id.contact_name);
            holder.phone = convertView.findViewById(R.id.phone_number);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        Custom item = getItem(position);
        holder.name.setText(item.getName());
        holder.phone.setText(item.getPhone());
        return convertView;
    }

    static class ViewHolder {
        TextView name, phone;
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved