在 Fragment 中展示 SQLite 數據,且每行包含圖片與按鈕點擊事件,需自定義 BaseAdapter 並在 getView 中綁定監聽器。以下為完整實現步驟:
public class Baby {
public long id;
public String name;
public int sex; // 0/1
public String birth;
public int imgResId; // 圖片資源 ID
}
public class BabyAdapter extends BaseAdapter {
private Context context;
private List data;
private LayoutInflater inflater;
public BabyAdapter(Context context, List data) {
this.context = context;
this.data = data;
inflater = LayoutInflater.from(context);
}
@Override public int getCount() { return data.size(); }
@Override public Object getItem(int pos) { return data.get(pos); }
@Override public long getItemId(int pos) { return data.get(pos).id; }
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_baby, parent, false);
holder = new ViewHolder();
holder.img = convertView.findViewById(R.id.iv_photo);
holder.name = convertView.findViewById(R.id.tv_name);
holder.btn = convertView.findViewById(R.id.btn_action);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Baby baby = data.get(position);
holder.img.setImageResource(baby.imgResId);
holder.name.setText(baby.name);
// 按鈕點擊事件,攜帶 position
holder.btn.setOnClickListener(v -> {
// 此處可通過 interface 回調 Fragment/Activity
Toast.makeText(context, "Clicked: " + baby.name, Toast.LENGTH_SHORT).show();
});
return convertView;
}
static class ViewHolder {
ImageView img;
TextView name;
Button btn;
}
}
public class BabyFragment extends Fragment {
private ListView listView;
private BabyAdapter adapter;
private List babyList = new ArrayList<>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_baby, container, false);
listView = root.findViewById(R.id.lv_babies);
adapter = new BabyAdapter(getContext(), babyList);
listView.setAdapter(adapter);
loadDataFromDB();
return root;
}
private void loadDataFromDB() {
// 建議使用 LoaderManager 或 RxJava 在後台查詢
new Thread(() -> {
SQLiteDatabase db = getContext().openOrCreateDatabase("baby.db", Context.MODE_PRIVATE, null);
Cursor cursor = db.rawQuery("SELECT * FROM baby", null);
List temp = new ArrayList<>();
while (cursor.moveToNext()) {
Baby b = new Baby();
b.id = cursor.getLong(cursor.getColumnIndex("_id"));
b.name = cursor.getString(cursor.getColumnIndex("name"));
b.sex = cursor.getInt(cursor.getColumnIndex("sex"));
b.birth = cursor.getString(cursor.getColumnIndex("birth"));
b.imgResId = R.drawable.default_baby; // 根據 sex 設置不同圖片
temp.add(b);
}
cursor.close(); db.close();
requireActivity().runOnUiThread(() -> {
babyList.clear();
babyList.addAll(temp);
adapter.notifyDataSetChanged();
});
}).start();
}
}
findViewById,提升滑動流暢度。baby 對象,或設置 setTag(position) 後在監聽器中取出。採用此架構,即可在 Fragment 中高效、穩定地展示帶交互控件的列表數據。