lundi 29 juin 2015

How to query single record based on RecyclerView item click

My app has a RecyclerView/CardView of Tasks. Each card is populated by my adapter with getAllTasksForUser() in my TaskTableController class:

public List<Task> getAllTasksForUser() {
        final String QUERY_ALL_RECORDS = "SELECT * FROM " + TaskEntry.TABLE_NAME;

        List<Task> taskList = new ArrayList<>();
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(QUERY_ALL_RECORDS, null);
        if (cursor.getCount() > 0) {
            while (cursor.moveToNext()) {
                Task task = new Task();
                int TaskId = cursor.getColumnIndex(TaskEntry.COLUMN_TASK_ID);
                task.setId(cursor.getString(TaskId));
                task.setTitle(cursor.getString(cursor.getColumnIndex(TaskEntry.COLUMN_TASK_TITLE)));
                task.setDue(new DateTime(cursor.getString(cursor.getColumnIndex(TaskEntry.COLUMN_TASK_DUE))));
                task.setNotes(cursor.getString(cursor.getColumnIndex(TaskEntry.COLUMN_TASK_NOTES)));
                task.setStatus(cursor.getString(cursor.getColumnIndex(TaskEntry.COLUMN_TASK_STATUS)));
                taskList.add(task);
            }
        } else {
            cursor.close();
            db.close();
            return taskList;
        }
        cursor.close();
        db.close();
        return taskList;
    }

which is used to populate a ListArray of Task objects in my Adapter.

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

    private List<Task> taskList;
    OnItemClickListener mItemClickListener;

    public TaskAdapter(List<Task> taskList) {
        this.taskList = taskList;
    }

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

    @Override
    public void onBindViewHolder(TaskViewHolder taskViewHolder, int i) {
        Task task = taskList.get(i);
        taskViewHolder.mTitle.setText(task.getTitle());
        taskViewHolder.mDue.setText(task.getDue().toString());
        if (task.getStatus().equals("completed")) {
            taskViewHolder.mStatus.setChecked(true);
        } else taskViewHolder.mStatus.setChecked(false);

    }

    @Override
    public TaskViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

        View itemView = LayoutInflater.from(viewGroup.getContext()).
                inflate(R.layout.tasklist_layout, viewGroup, false);

        return new TaskViewHolder(itemView);
    }

    public void SetOnItemClickListener(final OnItemClickListener mItemClickListener) {
        this.mItemClickListener = mItemClickListener;
    }

    public interface OnItemClickListener {
        void onItemClick(View view , int position);
    }

And subsequently in my MainActivity with

taskAdapter = new TaskAdapter(new TaskTableController(getActivity()).getAllTasksForUser());
            return rootView;

My question is, once one of these items is clicked, how can I retrieve the sqlite _ID or another unique identifier to used as an input for a more detailed query to populate another view. I've tried by adding in the MainActivity

@Override
        public void onViewCreated(View view, Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            mRecyclerView.setAdapter(taskAdapter);
            mRecyclerView.setHasFixedSize(true);
            mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
            mRecyclerView.setItemAnimator(new DefaultItemAnimator());
            taskAdapter.SetOnItemClickListener(new TaskAdapter.OnItemClickListener() {

                @Override
                public void onItemClick(View v, int position) {
                    m_ID = (TextView) v.findViewById(R.id._task_id);

                    Intent detailIntent = new Intent(v.getContext(), DetailActivity.class);
                    detailIntent.putExtra("TASK_ID", m_ID.getText().toString());
                    startActivity(detailIntent);
                }
            });

        }

In my TaskTableController class i've added another method

public Task getTaskByID(String Id) {
        final String SINGLE_TASK_QUERY = "SELECT * FROM " + TaskEntry.TABLE_NAME +
                " WHERE " + TaskEntry._ID + " = " + Id;
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(SINGLE_TASK_QUERY, null);

        Task task = new Task();
        while (cursor.moveToNext()){

            task.setId(cursor.getString(cursor.getColumnIndex(TaskEntry.COLUMN_TASK_ID)));
            task.setTitle(cursor.getString(cursor.getColumnIndex(TaskEntry.COLUMN_TASK_TITLE)));
            task.setDue(new DateTime(cursor.getString(cursor.getColumnIndex(TaskEntry.COLUMN_TASK_DUE))));
            task.setNotes(cursor.getString(cursor.getColumnIndex(TaskEntry.COLUMN_TASK_NOTES)));
        }
        return task;
    }

should I call getTaskByID() in my DetailActivity or my DetailFragment which is responsible for inflating the detailed view? And how do I pass the ID from the intent extra to the query method?

Aucun commentaire:

Enregistrer un commentaire