如何根据RecyclerView项目单击查询单个记录

时间:2015-06-30 00:58:50

标签: java android sqlite android-fragments android-intent

我的应用有一个RecyclerView / CardView of Tasks。每张卡都由我的getAllTasksForUser()类中的TaskTableController适配器填充:

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

用于填充Adapter中的TaskArray的Task对象。

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

随后在我的MainActivity

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

我的问题是,一旦点击其中一个项目,我如何检索sqlite _ID或另一个唯一标识符,用作另一个Activity /片段中调用的更详细查询的输入(我不确定哪一个)。我试过添加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);
                }
            });

        }

在我的TaskTableController课程中,我添加了另一种方法

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

我应该在我的getTaskByID()或我的DetailActivity中致电DetailFragment,该ID负责通知详细视图吗?如何将&.preloader-remove{ -webkit-animation: fadeOutUp 1s; animation: fadeOutUp 1s; } 从intent extra传递给查询方法?

3 个答案:

答案 0 :(得分:0)

这就是我多数时间的表现:

1.在适配器的构造函数中,添加一个参数(OnClickListener接口)并将其另存为自定义适配器类中的属性。

2.在你的onCreateViewHolder方法中,将你的点击监听器添加到你的视图中(例如,在你的Activity o片段中实现)。在你的情况下:

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

3.实施此方法,从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.
}

我希望这会对人有所帮助。

答案 1 :(得分:0)

Juan Aguilar Guisado的正确答案,例如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);
            }
        }
    });

}

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


}

答案 2 :(得分: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);
}