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 :");
}
我正在使用 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 :");
}