【问题标题】:How to query single record based on RecyclerView item click如何根据RecyclerView项目点击查询单条记录
【发布时间】:2015-06-30 00:58:50
【问题描述】:

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

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

用于在我的适配器中填充任务对象的 ListArray。

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 或另一个唯一标识符以用作在另一个活动/片段中调用的更详细查询的输入(我不确定哪一个)。我试过添加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;
    }

我应该在我的DetailActivity 或我的DetailFragment 中调用getTaskByID(),它负责放大详细视图吗?以及如何将意图额外的ID 传递给查询方法?

【问题讨论】:

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


    【解决方案1】:

    这是我大多数时候的做法:

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

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

    【讨论】:

    • 一旦我从项目单击中提取了我需要的字段,如何将其传递给我的片段,该片段附加到另一个调用getTaskbyID 的活动?我应该把它放在 Intent EXTRA 中吗?
    • Intent EXTRAS 用于活动之间的转换。对于片段之间的转换,最好在创建新实例时使用“参数”,最佳实践here。你可以把你的 id 放在那里(我猜是“int”)。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      @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);
      }
      

      【讨论】:

        猜你喜欢
        • 2018-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多