android将recyclerview项位置传递给对话框按钮侦听器
单击recyclerview项中的按钮时,将显示具有多个按钮(cancalButton、deleteButton)的对话框 所以我做了两个监听器(cancelListener,deleteListener) Show dialog成功,cancelListener运行良好,但我无法在DeltelListener中执行我想要的操作 我想在用户单击对话框中的删除按钮时删除firebase中的数据 因此,我必须知道单击recyclerview项查找数据的位置。(因为我可以通过从array.get(position.getTimestamp)获取key来查找数据 如何获取deleteListener中的项目位置android将recyclerview项位置传递给对话框按钮侦听器,android,android-recyclerview,onclicklistener,Android,Android Recyclerview,Onclicklistener,单击recyclerview项中的按钮时,将显示具有多个按钮(cancalButton、deleteButton)的对话框 所以我做了两个监听器(cancelListener,deleteListener) Show dialog成功,cancelListener运行良好,但我无法在DeltelListener中执行我想要的操作 我想在用户单击对话框中的删除按钮时删除firebase中的数据 因此,我必须知道单击recyclerview项查找数据的位置。(因为我可以通过从array.get(po
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();
}
};
}
因为您的方法
private void openDialog(final int position)
具有位置信息。您可以这样做,只需为deleteListener(DeleteListenerWithItemPos)创建一个类,然后将位置作为参数传递给构造函数
如何实现的示例如下所示:
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();
}
}
尚未查看整个代码,但private中的参数是否无效openDialog(最终int位置)有物品位置吗?@lyncs你好lyncs。是的,我添加了这个。但是我不知道如何才能将它传递给Deltelistener。你能显示你的代码吗DialogDeletePin@lyncx现在我添加DialogDeltePin代码!我解决了它谢谢!谢谢你的回答!我将它应用到我的代码并显示错误..在同一个java文件中添加此代码正确吗?我解决了它!谢谢不客气!你能帮我把这个标记为接受答案吗?谢谢!
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();
}
}