在 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 一致。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;
}
}