簡體   English   中英

使用SQLite數據庫保存CheckBox狀態

[英]Saving CheckBox state with SQLite Database

我正在構建一個使用SQLite數據庫保存列表項的列表應用程序。 列表項由UUID,名稱和布爾值組成,以確定是否解決了該問題(數據庫將其存儲為int)。 我注意到的是,當用戶關閉某個任務並添加了新任務時,該列表會重新加載,以便現在取消選中已選中的任務。 此外,重新啟動應用程序后,列表會重新加載,因此所有已選中的任務都將變為未選中狀態。

現在,我一直在思考想法,到目前為止,我所做的是在onBindViewHolder()方法的TaskAdapter類中,我調用setOnCheckedChangedListener()以便在用戶檢查任務時啟動烤面包。 我覺得我應該在這里做一些事情來更新數據庫中的特定任務,但是我不知道如何做。

附加說明:我使用的是singleton類,其中包含所有數據庫方法,例如添加任務,更新任務以及從數據庫中檢索所有任務。

ListFragment.java

public class ListFragment extends Fragment implements AddTaskDialog.addTask{

private static final String ADD_TASK_TAG = "ADD_TASK_DIALOG";
private RecyclerView mRecyclerView;
private TaskAdapter mAdapter;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_list, container, false);

    mRecyclerView = view.findViewById(R.id.recycler_view);
    LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
    mRecyclerView.setLayoutManager(layoutManager);
    updateUI();

    return view;
}

private void updateUI(){
    List<Task> tasks = TaskLab.getTaskLab(getContext()).getTaskList();

    if(mAdapter == null) {
        mAdapter = new TaskAdapter(tasks);
        mRecyclerView.setAdapter(mAdapter);
    }else{
        mAdapter.setTaskList(tasks);
        mAdapter.notifyDataSetChanged();
    }
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.toolbar_layout,menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()){
        case R.id.add_task_button:
            // Launch a dialog.
            AddTaskDialog dialog = new AddTaskDialog();
            FragmentManager manager = getFragmentManager();
            dialog.setTargetFragment(ListFragment.this,1);
            dialog.show(manager,ADD_TASK_TAG);
            return true;
        default:
            return super.onOptionsItemSelected(item);

    }
}

// Part of the addTask interface created in AddTaskDialog
@Override
public void addTask(String taskName) {
    Task task = new Task();
    task.setName(taskName);
    TaskLab.getTaskLab(getContext()).addTask(task);
    updateUI();
}
}

TaskAdapter.java

public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskHolder> {

private List<Task> mTaskList;

public TaskAdapter(List<Task> tasks){
    mTaskList = tasks;
}
@Override
public TaskAdapter.TaskHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_layout,parent,false);
    return new TaskHolder(view);
}

@Override
public void onBindViewHolder(TaskAdapter.TaskHolder holder, int position) {
    Task task = mTaskList.get(position);
    holder.bindData(task);

    holder.mTaskCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
            if(isChecked){
                Toast.makeText(compoundButton.getContext(),"Task Solved!",Toast.LENGTH_SHORT).show();
            }
        }
    });
}

@Override
public int getItemCount() {
    return mTaskList.size();
}

public void setTaskList(List<Task> tasks) {
    mTaskList = tasks;
}

public class TaskHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    private TextView mTaskName;
    private CheckBox mTaskCheckBox;

    public TaskHolder(View itemView) {
        super(itemView);
        mTaskName = itemView.findViewById(R.id.task_name);
        mTaskCheckBox = itemView.findViewById(R.id.task_checkbox);
    }

    private void bindData(Task task) {
        mTaskName.setText(task.getName());
        mTaskCheckBox.setChecked(task.isSolved());
    }

    @Override
    public void onClick(View view) {
    }
}


}

TaskLab.java (Singleton類)

public class TaskLab {

private static TaskLab sTaskLab;
private Context mContext;

private SQLiteDatabase mDatabase;

private TaskLab(Context context) {
    mContext = context.getApplicationContext();
    mDatabase = new TaskBaseHelper(mContext).getWritableDatabase();
}

public static TaskLab getTaskLab(Context context){
    if(sTaskLab == null) {
        sTaskLab = new TaskLab(context);
    }

    return sTaskLab;
}

// Add DataBase operation method here.

private ContentValues getContentValues(Task task) {
    ContentValues values = new ContentValues();
    values.put(TaskTable.Cols.UUID, task.getId().toString());
    values.put(TaskTable.Cols.NAME, task.getName());
    values.put(TaskTable.Cols.SOLVED, task.isSolved() ? 1 : 0);

    return values;
}

public void addTask(Task task) {
    ContentValues values = getContentValues(task);
    mDatabase.insert(TaskTable.TABLE_NAME,null,values);
}

// Don't really understand this method
public void updateTask(Task task) {
    String uuidString = task.getId().toString();
    ContentValues values = getContentValues(task);

    mDatabase.update(TaskTable.TABLE_NAME,values, TaskTable.Cols.UUID + " = ?",
            new String[] {uuidString});
}

public TaskCursorWrapper queryTasks(String whereClause, String[] whereArgs) {
    Cursor cursor = mDatabase.query(TaskTable.TABLE_NAME,null,whereClause,whereArgs,null,null,null);
    return new TaskCursorWrapper(cursor);
}

public List<Task> getTaskList(){

    List<Task> taskList = new ArrayList<>();
    TaskCursorWrapper cursor = queryTasks(null,null);

    try{
        cursor.moveToFirst();
        while(!cursor.isAfterLast()){
            Task task = cursor.getTask();
            taskList.add(task);
            cursor.moveToNext();
        }
    }finally {
        cursor.close();
    }

    return taskList;
}

在適配器中,當您使用onclick時,當前項將更新,但是在滾動單擊的位置時復選框將不匹配。 因為適配器僅考慮您從ur代碼編寫的位置。 因此,請使用任何吸氣劑/阻焊劑來避免此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM