ImageViewHolder.getAdapterPosition() / .getLayoutPosition() 不起作用

ImageViewHolder.getAdapterPosition() / .getLayoutPosition() does not work

我正在使用 RecyclerView 显示我上传到 firebase 的一堆图像。当我点击一张图片时,会出现一个带有一些按钮的弹出菜单,用于添加和删除该图片。

我想获取我的 recyclerView 的实际位置,然后将该位置解析为 Firebase 查询以将该图像添加到不同的 "table" 或将其删除。 这就是我的 onBindViewHolder 在我的 Adapter class 中的样子:

    @Override
    public void onBindViewHolder(final ImageViewHolder holder, int position) {
        Upload uploadCurrent = mUploads.get(position);
        holder.textViewName.setText(uploadCurrent.getName());
        Picasso.with(mContext)
            .load(uploadCurrent.getImageUrl())
            .placeholder(R.mipmap.ic_launcher)
            .fit()
            .centerCrop()
            .into(holder.imageView);

        pos = holder.getAdapterPosition(); 
        uploadAtPosition = mUploads.get(pos);
        Log.e(Integer.toString(pos),"error is :");
}

这是我在 Activity 中使用的代码:

    public void showPopupMenu(View view) {

        PopupMenu popupMenu = new PopupMenu(this, view);
        popupMenu.setOnMenuItemClickListener(this);
        MenuInflater inflater = popupMenu.getMenuInflater();
        inflater.inflate(R.menu.popup_menu, popupMenu.getMenu());
        popupMenu.show();
    }

    @Override
    public boolean onMenuItemClick(MenuItem menuItem) {
        switch (menuItem.getItemId()){
            case R.id.addToMenu :
                String uploadId = menuDatabaseRef.push().getKey();
          menuDatabaseRef.child(uploadId).setValue(ImageAdapter.uploadAtPosition);

            case R.id.deleteFromMenu :

            case R.id.deleteFromDatabase :
        }

        return false;
}     

我遇到的问题是 .getAdapterPosition() 不是 return RecylerView 中实际的当前项目位置。有时它会跳过一个数字,当我向上滚动时它不会像 6,5,4...,0.

我一定是做错了什么,请帮忙。

我也试过 .getLayoutPosition() 和 .getItemId()...

您必须在 bindview holder 中使用 setTag() 和 getTag(),这样您才能获得特定项目的准确位置。

例如:

    holder.textViewName.setTag(position);
    holder.textViewName.setOnClickListener(View v)
    {
    int pos=v.getTag();
    uploadAtPosition = mUploads.get(pos);
    }

尝试使用您已有的position变量

@Override
public void onBindViewHolder(final ImageViewHolder holder, int position) {
    Upload uploadCurrent = mUploads.get(position);
    holder.textViewName.setText(uploadCurrent.getName());
    Picasso.with(mContext)
        .load(uploadCurrent.getImageUrl())
        .placeholder(R.mipmap.ic_launcher)
        .fit()
        .centerCrop()
        .into(holder.imageView);

    pos = position; 
    uploadAtPosition = mUploads.get(pos);
    Log.e(Integer.toString(pos),"error is :");
}