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

Android Fragment 中使用 BaseAdapter 綁定 SQLite 數據至 ListView:圖片與按鈕事件完整實現

     編輯:程式設計疑難解答

Android Fragment 中使用 BaseAdapter 綁定 SQLite 數據至 ListView:圖片與按鈕事件完整實現

在 Fragment 中展示 SQLite 數據,且每行包含圖片與按鈕點擊事件,需自定義 BaseAdapter 並在 getView 中綁定監聽器。以下為完整實現步驟:

1. 定義數據實體類

public class Baby {
    public long id;
    public String name;
    public int sex; // 0/1
    public String birth;
    public int imgResId; // 圖片資源 ID
}

2. 自定義 Adapter

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;
    }
}

3. Fragment 中加載數據並設置 Adapter

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();
    }
}

關鍵提示

  • ViewHolder 模式:避免重複 findViewById,提升滑動流暢度。
  • 按鈕事件傳遞數據:利用 lambda 捕獲 baby 對象,或設置 setTag(position) 後在監聽器中取出。
  • 異步查詢:嚴禁在 UI 線程直接操作 SQLite,否則會 ANR。

採用此架構,即可在 Fragment 中高效、穩定地展示帶交互控件的列表數據。

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