【问题标题】:get item id when click into RecyclerView单击进入 RecyclerView 时获取项目 ID
【发布时间】:2016-09-25 10:47:33
【问题描述】:

我有一个带有RecyclerView 和Sqlite 的应用程序,我使用DialogFragment 将数据插入到表中,当我在RecyclerView 上的项目中单击longclick 时,我会显示另一个Dialog,它有一个删除按钮,但我无法捕捉到我点击它的项目的ID,知道吗?

这是删除方法:

public void deleteARow(int idA)
{
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TODO_TABLE, id + "=" + idA, null);
    db.close();
}

这是 RecyclerView 适配器:

 public void onBindViewHolder(final RecyclerAdapter.ViewHolder holder, final int position) {
    final ToDoModule appShowModule = dbList.get( position );

    holder.Title.setText(dbList.get(position).getActionTitle());
    holder.Desc.setText(dbList.get(position).getActionDesc());
    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            FragmentTransaction fragmentTransaction = ((AppCompatActivity)context).getSupportFragmentManager().beginTransaction();
            actionOption actionOption = new actionOption();
            actionOption.show(fragmentTransaction,"fragment_edit_name");
            return true;
        }
    });}

这是删除按钮点击

   public void onClick(View view) {
    ToDoModule to = new ToDoModule();
    db.deleteARow(to.getId());
    Toast.makeText(getContext(), "delete", Toast.LENGTH_SHORT).show();
}

这是从数据库表中获取数据的方法

   public List<ToDoModule> getDataFromDB(){
    List<ToDoModule> modelList = new ArrayList<ToDoModule>();
    String query = "select * from "+ TODO_TABLE;
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(query,null);
    if (cursor.moveToFirst()){
        do {
            ToDoModule model = new ToDoModule();
            String Title = cursor.getString(cursor.getColumnIndex(COLUMN_Title));
            String Description = cursor.getString(cursor.getColumnIndex(COLUMN_Des));
            int ID = (cursor.getColumnIndex(id));
            model.setActionTitle(Title);
            model.setActionDesc(Description);
            model.setId(ID);
            modelList.add(model);
        }while (cursor.moveToNext());
    }
    return modelList;
}

【问题讨论】:

    标签: android sqlite android-recyclerview


    【解决方案1】:

    我正在使用这种方式来检测 click 和 longClick 事件:

    recyclerView.addOnItemTouchListener(new RecyclerViewClickManager(context,
                recyclerView, new RecyclerViewClickManager.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                //this is single click
                //if you want to get viewholder here :
                MyViewHolder viewHolder=(MyViewHolder) recyclerViewNotes.getChildViewHolder(view);
                //also you have position so you can get your item id by position
            }
    
            @Override
            public void onItemLongClick(View view, int position) {
                //this is long click
            }
        }));
    

    还有 RecyclerViewClickManager 类:

    public class RecyclerViewClickManager implements RecyclerView.OnItemTouchListener {
    //this is the click interface for both click and longClick
    public interface OnItemClickListener {
        void onItemClick(View view, int position);
    
        void onItemLongClick(View view, int position);
    }
    
    private OnItemClickListener mListener;
    
    private GestureDetector mGestureDetector;
    
    private RecyclerView mRecyclerView;
    
    public RecyclerViewClickManager(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
        mListener = listener;
    
        mRecyclerView=recyclerView;
    
        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }
    
            @Override
            public void onLongPress(MotionEvent e) {
                View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());
                //here if you want to get ViewHolder too :
                YourViewHolder viewholder=(YourViewHolder) recyclerView.findContainingViewHolder(childView);
    
                if (childView != null && mListener != null) {
                    mListener.onItemLongClick(childView, recyclerView.getChildAdapterPosition(childView));
                }
            }
        });
    }
    
    @Override
    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
        View childView = view.findChildViewUnder(e.getX(), e.getY());
    
    
    
        if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
            mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
        }
    
        return false;
    }
    
    @Override
    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
    }
    
    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    }
    }
    

    您也可以点击此链接:recycler-view-item-click-handler

    这个 SO 问题也很适合参考:recyclerview-onclick

    【讨论】:

    • 我想获取 id 并将其发送到删除方法!
    • 所以它很简单,在你的onItemClick 方法中:dbList.get(position).getId() 会给你点击位置的ID。
    • 我做到了,但不工作,在 deppugar 上给我 id 总是 0
    • 你能告诉我你尝试了什么吗?发布您的代码,我会为您修复它
    • public void onItemLongClick(View view, int position) { ToDoModule a = new ToDoModule(); dbList.get(位置).getId(); a.setX(dbList.get(position).getId()); FragmentManager fm = getSupportFragmentManager(); actionOption actionOption = new actionOption(); actionOption.show(fm,"fragment_edit_name");我创建的变量 x 将位置从点击发送到删除方法,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2018-09-01
    • 2019-11-23
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多