0

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 which is called in another Activity/fragment (i'm not sure which one). 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?

idclark
  • 948
  • 1
  • 8
  • 27

3 Answers3

0

This is how I do it most times:

1.In the constructor of your adapter, add an parameter (OnClickListener interface) and save it as an attribute in your custom adapter class.

2.In your onCreateViewHolder method, add to your view this click listener (implemented, for instance, in your Activity o fragment).In your case:

itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    listClickListener.onClick(v);
                }
            });

3.Implement this method, getting the position clicked from the RecyclerView getChildPosition.

@Override
public void onClick(View view) {     
     int itemPosition = recyclerView.getChildPosition(view);   
     //With the position you should be able to get the object you want to extract from your adapter.
}

I hope this would help man.

Juan Aguilar Guisado
  • 1,687
  • 1
  • 12
  • 21
  • And once i extract the field that I need from the item click, how do I pass that to my fragment attached to another activity where `getTaskbyID` is called? Should i put it in an Intent EXTRA? – idclark Jun 30 '15 at 19:56
  • Intent EXTRAS are for transitions between Activities. For transitions between fragments is better using "arguments" while creating a new instance, best practice [here](http://stackoverflow.com/questions/9245408/best-practice-for-instantiating-a-new-android-fragment). There you can put your id ("int", I guess). – Juan Aguilar Guisado Jul 01 '15 at 07:19
0

Right answer from Juan Aguilar Guisado and for example in RecycleviewAdapter

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Picasso.with(mContext).load(R.drawable.add2new).into(holder.image);
    holder.text.setText(mDataSet.get(position));
    holder.askprice.setText(mAskPrice.get(position));
    holder.bidprice.setText(mBidPrice.get(position));
    holder.profit.setText(mProfit.get(position));

    holder.setClickListener(new FavoriteAdapter.ViewHolder.ClickListener() {
        public void onClick(View v, int pos, boolean isLongClick) {
            if (isLongClick) {

                // View v at position pos is long-clicked.
                String poslx = pos + "";
                Toast.makeText(mContext, "longclick " + poslx, Toast.LENGTH_SHORT).show();

            } else {
                // View v at position pos is clicked.
                String possx = pos + "";
                Toast.makeText(mContext, "shortclick " + possx, Toast.LENGTH_SHORT).show();
                //toggleSelection(pos);
            }
        }
    });

}

and in ViewHolder

static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {

    public ImageView image;
    public TextView text;
    public TextView askprice;
    public TextView bidprice;
    public TextView profit;
    private ClickListener clickListener;

    public ViewHolder(View itemView) {
        super(itemView);
        image = (ImageView) itemView.findViewById(R.id.image);
        text = (TextView) itemView.findViewById(R.id.text);
        askprice = (TextView) itemView.findViewById(R.id.askprice);
        bidprice = (TextView) itemView.findViewById(R.id.bidprice);
        profit = (TextView) itemView.findViewById(R.id.profit);

        // We set listeners to the whole item view, but we could also
        // specify listeners for the title or the icon.
        itemView.setOnClickListener(this);
        itemView.setOnLongClickListener(this);

    }


    /* Interface for handling clicks - both normal and long ones. */
    public interface ClickListener {

        /**
         * Called when the view is clicked.
         *
         * @param v view that is clicked
         * @param position of the clicked item
         * @param isLongClick true if long click, false otherwise
         */
        public void onClick(View v, int position, boolean isLongClick);

    }

    /* Setter for listener. */
    public void setClickListener(ClickListener clickListener) {
        this.clickListener = clickListener;
    }

    @SuppressWarnings("deprecation")
    @Override
    public void onClick(View v) {

        // If not long clicked, pass last variable as false.
        clickListener.onClick(v, getPosition(), false);
    }

    @SuppressWarnings("deprecation")
    @Override
    public boolean onLongClick(View v) {

        // If long clicked, passed last variable as true.
        clickListener.onClick(v, getPosition(), true);
        return true;
    }


}
eurosecom
  • 2,932
  • 4
  • 24
  • 38
0
@Override
public TaskViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

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

    TaskViewHolder viewHolder = new TaskViewHolder(itemView);
    viewHolder.itemView.setClickable(true);
    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
               if (taskListCallbacks != null)
                      taskListCallbacks.onTaskClick(taskList.get(viewHolder.getAdapterPosition()), v, viewHolder.getAdapterPosition());
         }
    });

    return viewHolder;
}

public void setTaskListCallbacks(TaskListCallbacks taskListCallbacks){
    this.taskListCallbacks = taskListCallbacks;
}

public interface TaskListCallbacks{
    void onTaskClick(Task task, View v, int position);
}
krawa
  • 583
  • 6
  • 12