android - android将recyclerview项目位置传递给对话框按钮监听器
问题描述
单击 recyclerview 项目中的按钮时,会显示具有多个按钮(cancalButton、deleteButton)的对话框。
所以我做了两个监听器(cancelListener,deleteListener)。
显示对话框成功并且 cancelListener 运行良好,但我无法在 delteListener 中做我想做的事。
当用户单击对话框中的删除按钮时,我想删除 firebase 中的数据。
所以我必须知道点击recyclerview项目的位置才能找到数据。(因为我可以通过从 array.get(position).getTimestamp 获取密钥来查找数据。
如何在 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();
}
};
}
删除对话框引脚
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)
具有位置信息。一种方法是为 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();
}
}
推荐阅读
- php - 数组值只返回第一个字符和额外的值
- python-3.x - 无法使 Python 3.7 在 Ubuntu 18.04 中运行
- codenameone - 在代号的容器中的两个图像之间添加空格
- android - Android 上的 Mapbox 无法添加源异常
- performance - 有没有办法在负载测试中找到搜索结果的响应时间?
- r - 如何在 R 包的手册中包含 Authors@R?
- java - 变量仅存储 Firebase 数据库的最后一个值
- javascript - 您可以访问 Chrome 开发者网络标签数据吗?
- ajax - 在提交表单时显示感谢信息
- java - 检查 Liquibase 前提条件中是否不为空或不为 0