1

ユーザーがチェックボックスを変更したときに、アイテムをリストビューに保存する必要があります。

リスト アイテム用のビュー ホルダーを備えたカスタム ベース アダプターがあります。

チェックボックスによって、オブジェクトの状態を true と false に設定できますが、データの保存方法がわかりません。

このコードで nullpointer 例外が発生します。DatabaseHandler クラスを呼び出そうとしているためだと思います。

ここから SQLite にデータを取得する方法についての指針をいただければ幸いです。

My Custom Base アダプター

public class ChecklistBaseAdapter extends BaseAdapter {
private static ArrayList<Checklist> searchArrayList;
Context currentcontext;
DatabaseHandler db = new DatabaseHandler(currentcontext);
private LayoutInflater mInflater;

public ChecklistBaseAdapter(Context context, ArrayList<Checklist> results) {

    searchArrayList = results;
    mInflater = LayoutInflater.from(context);
}

public int getCount() {

    return searchArrayList.size();
}

public void remove(int position) {

    searchArrayList.remove(position);
    notifyDataSetChanged();
}

public void removeAll() {

    searchArrayList.clear();
    notifyDataSetChanged();
}

public void notifyChange() {
    notifyDataSetChanged();
}

public Object getItem(int position) {

    return searchArrayList.get(position);

}

public long getItemId(int position) {

    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {

    final ViewHolder holder;
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.checklistitem, null);
        holder = new ViewHolder();

        holder.cbStatus = (CheckBox) convertView
                .findViewById(R.id.checkbox);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.cbStatus.setText(searchArrayList.get(position).getName());
    if (searchArrayList.get(position).getStatus().equals("F")) {
        holder.cbStatus.setChecked(false);
    } else {
        holder.cbStatus.setChecked(true);
    }
    holder.cbStatus
            .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked) {
                    String name = holder.cbStatus.getText().toString();
                    if (isChecked) {
                        for (int x = 0; x < searchArrayList.size(); x++) {
                            Checklist checklist = new Checklist();

                            checklist = searchArrayList.get(x);
                            if (name.equals(checklist.getName())) {
                                checklist.setStatus("T");



                                db.updateCheckList(checklist);
                                searchArrayList.set(x, checklist);

                            }

                        }

                    } else {
                        for (int x = 0; x < searchArrayList.size(); x++) {
                            Checklist checklist = new Checklist();

                            checklist = searchArrayList.get(x);
                            if (name.equals(checklist.getName())) {
                                checklist.setStatus("F");



                                searchArrayList.set(x, checklist);
                                db.updateCheckList(checklist);
                            }

                        }
                    }

                }
            });

    return convertView;
}

static class ViewHolder {

    CheckBox cbStatus;

}

データベース ハンドラ クラスの update メソッド

public int updateCheckList(Checklist checklist) {
    SQLiteDatabase db = this.getWritableDatabase();


    ContentValues values = new ContentValues();
    values.put(CHECK_NOTE_GUID, checklist.getNoteguid());
    values.put(CHECK_KEY_NAME, checklist.getName());
    values.put(CHECK_KEY_STATUS, checklist.getStatus());
    values.put(CHECK_KEY_GUID, checklist.getGuid());

    // updating row
    db.update(TABLE_CHECKLIST, values, CHECK_KEY_ID + " = ?",
            new String[] { String.valueOf(checklist.getID()) });
    db.close();
    return 1;
}
4

1 に答える 1

0

currentContextがまだnullのときに、DatabaseHandlerを作成しています。行を置く

DatabaseHandler db = new DatabaseHandler(currentcontext);

クラスのコンストラクターに追加し、currentContextの代わりに渡されたコンテキストを使用するか、事前にcurrentContextを設定します。

public ChecklistBaseAdapter(Context context, ArrayList<Checklist> results) {
    searchArrayList = results;
    mInflater = LayoutInflater.from(context);
    currentContext = context;
    DatabaseHandler db = new DatabaseHandler(currentContext);
}
于 2013-03-13T12:22:14.860 に答える