android将recyclerview项目位置传递给对话框按钮监听器
Posted
技术标签:
【中文标题】android将recyclerview项目位置传递给对话框按钮监听器【英文标题】:android Pass recyclerview item position to dialog button listener 【发布时间】:2021-07-22 12:13:15 【问题描述】:点击recyclerview项目中的按钮时,显示带有多个按钮(cancalButton,deleteButton)的对话框。
所以我做了两个监听器(cancelListener,deleteListener)。
显示对话框成功,cancelListener 运行良好,但我无法在 delteListener 中做我想做的事情。
当用户单击对话框中的删除按钮时,我想删除 firebase 中的数据。
所以我必须知道点击 recyclerview 项目的位置才能找到数据。 (因为我可以通过从 array.get(position).getTimestamp 获取 key 来找到数据。
如何在 deleteListener 中获取项目位置?
public class AdapterExplorePlace extends RecyclerView.Adapter<AdapterExplorePlace.ViewHolder> implements Pin_BottomSheetDialog.BottomSheetListener
ArrayList<ItemExplore> array;
Context context;
private AdapterExplorePlace.RecyclerViewClickListener listener;
private DialogDeletePin dialog;
DatabaseReference pinRef;
FirebaseAuth mAuth;
String currentPage;
@ColorInt int starColor;
@ColorInt int startextColor;
public AdapterExplorePlace(ArrayList<ItemExplore> array, Context context, AdapterExplorePlace.RecyclerViewClickListener listener)
this.array = array;
this.context =context;
this.listener = listener;
@NonNull
@Override
public AdapterExplorePlace.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
SharedPreferences sharedPreferences = context.getSharedPreferences("file", MODE_PRIVATE);
starColor = sharedPreferences.getInt("starColor", 0);
startextColor = sharedPreferences.getInt("startextColor", 0);
currentPage = sharedPreferences.getString("currentPage", "");
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_explore_place,parent,false);
mAuth = FirebaseAuth.getInstance();
pinRef = FirebaseDatabase.getInstance().getReference("pinData").child(mAuth.getUid()).child(currentPage);
return new AdapterExplorePlace.ViewHolder(view);
@Override
public void onBindViewHolder(@NonNull AdapterExplorePlace.ViewHolder holder, int position)
if(array.get(position).getThumbnail() == null)
holder.explorePlaceImage.setImageResource(R.drawable.defalut_place_image);
else
Glide.with(context)
.load(array.get(position).getThumbnail())
.centerCrop()
.dontAnimate()
.into(holder.explorePlaceImage);
holder.explorePlaceRegion.setText(String.valueOf(array.get(position).getPlaceAddress()));
holder.explorePlaceCategory.setText(String.valueOf(array.get(position).getPlaceCategory()));
holder.explorePlaceName.setText(String.valueOf(array.get(position).getPlaceName()));
holder.explorePlaceStyle.setText(String.valueOf(array.get(position).getPlaceStyle()));
holder.explorePlaceVisitedMember.setText(String.valueOf(array.get(position).getMember()));
holder.explorePlaceStyle.setTextColor(starColor);
holder.timestamp=String.valueOf(array.get(position).getTimestamp());
Drawable styleDrawable = ContextCompat.getDrawable(context,R.drawable.rounded);
styleDrawable.setColorFilter(new PorterDuffColorFilter(starColor, PorterDuff.Mode.SRC_IN));
holder.explorePlaceStyle.setBackground(styleDrawable);
pinRef.addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
for(DataSnapshot pinCheckSnap : snapshot.getChildren())
Log.d("####Icon Check", String.valueOf(String.valueOf(pinCheckSnap.getValue()).contains(holder.timestamp)));
if(String.valueOf(pinCheckSnap.getValue()).contains(holder.timestamp))
holder.btnExplorePlacePin.setBackgroundResource(R.drawable.ic_scrap_active);
holder.btnExplorePlacePin.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
openDialog(position);
);
break;
else
holder.btnExplorePlacePin.setBackgroundResource(R.drawable.ic_scrap_inactive);
holder.btnExplorePlacePin.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Bundle args = new Bundle();
args.putString("timestamp", holder.timestamp);
Pin_BottomSheetDialog bottomSheet = new Pin_BottomSheetDialog();
bottomSheet .setArguments(args);
bottomSheet.show(((FragmentActivity)context).getSupportFragmentManager(), "pinBottomSheet");
);
@Override
public void onCancelled(@NonNull DatabaseError error)
);
@Override
public int getItemCount()
return array.size();
@Override
public void onButtonClicked(String text)
public interface RecyclerViewClickListener
void onClick(View v, int position);
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
ImageView explorePlaceImage;
TextView explorePlaceRegion;
TextView explorePlaceCategory;
TextView explorePlaceName;
TextView explorePlaceStyle;
TextView explorePlaceVisitedMember;
String timestamp;
ImageButton btnExplorePlacePin;
AdapterView.OnItemClickListener onItemClickListener;
public ViewHolder(@NonNull View itemView)
super(itemView);
explorePlaceImage =itemView.findViewById(R.id.explorePlaceImage);
explorePlaceRegion =itemView.findViewById(R.id.explorePlaceRegion);
explorePlaceCategory =itemView.findViewById(R.id.explorePlaceCategory);
explorePlaceName =itemView.findViewById(R.id.explorePlaceName);
explorePlaceStyle =itemView.findViewById(R.id.explorePlaceStyle);
explorePlaceVisitedMember =itemView.findViewById(R.id.explorePlaceVisitedMember);
btnExplorePlacePin =itemView.findViewById(R.id.btnExplorePlacePin);
itemView.setOnClickListener(this);
@Override
public void onClick(View v)
listener.onClick(itemView, getAdapterPosition());
void setItemClickListener(AdapterView.OnItemClickListener onItemClickListener)
this.onItemClickListener = onItemClickListener;
private void openDialog(final int position)
dialog = new DialogDeletePin(context,cancelListener, deleteListener);
dialog.setCancelable(true);
dialog.getWindow().setGravity(Gravity.CENTER);
dialog.show();
View.OnClickListener cancelListener = new View.OnClickListener()
public void onClick(View v)
dialog.dismiss();
;
View.OnClickListener deleteListener = new View.OnClickListener()
public void onClick(View v)
//I need to know item position for deleting data.
Log.d("####dialog","click delete");
dialog.dismiss();
;
删除DialogPin
class DialogDeletePin extends Dialog
private Button btnCancelDeletePin;
private Button btnDeletePin;
private View.OnClickListener cancelListener;
private View.OnClickListener deleteListener;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
// 다이얼로그 외부 화면 흐리게 표현
WindowManager.LayoutParams lpWindow = new WindowManager.LayoutParams();
lpWindow.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;
lpWindow.dimAmount = 0.6f;
getWindow().setAttributes(lpWindow);
setContentView(R.layout.dialog_delte_pin);
btnCancelDeletePin = findViewById(R.id.btnCancelDeletePin);
btnCancelDeletePin.setOnClickListener(cancelListener);
btnDeletePin = findViewById(R.id.btnDeletePin);
btnDeletePin.setOnClickListener(deleteListener);
//클릭이벤트
public DialogDeletePin(Context context, View.OnClickListener canceltListener, View.OnClickListener deleteListener)
super(context, android.R.style.Theme_Translucent_NoTitleBar);
this.cancelListener = canceltListener;
this.deleteListener = deleteListener;
【问题讨论】:
没有看完整代码但是private void openDialog(final int position)中的参数不是有item位置吗? @lyncs 你好 lyncs。是的,我补充说。但我不知道如何将其传递给 delteListener 你能显示你的 DialogDeletePin 代码吗 @lyncx 现在我添加 DialogDeltePin 代码! 我解决了,谢谢! 【参考方案1】:由于您的方法private void openDialog(final int position)
具有位置信息。一种方法是为 deleteListemer (DeleteListenerWithItemPos) 创建一个类,然后将 position
作为参数传递给构造函数。
如何实现的例子如下:
private void openDialog(final int position)
deleteListener = new DeleteListenerWithItemPos(position);
dialog = new DialogDeletePin(context,cancelListener, deleteListener);
dialog.setCancelable(true);
dialog.getWindow().setGravity(Gravity.CENTER);
dialog.show();
View.OnClickListener deleteListener;
public static class DeleteListenerWithItemPos implements View.OnClickListener()
private int itemPos;
public DeleteListenerWithItemPos(int itemPos)
this.itemPos = itemPos;
public void onClick(View v) =
itemPos; //get itemPos here
Log.d("####dialog","click delete");
dialog.dismiss();
【讨论】:
感谢您的回答!我将它应用于我的代码并显示错误..将此代码添加到同一个 java 文件中是否正确? 不客气!你能帮我把它标记为接受的答案吗?谢谢!以上是关于android将recyclerview项目位置传递给对话框按钮监听器的主要内容,如果未能解决你的问题,请参考以下文章
RecyclerView 的行正在洗牌和改变图片:android
Android - 在 RecyclerView 中滚动时颜色重复