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:检测到不一致。无效的项目位置

RecyclerView 的行正在洗牌和改变图片:android

Android recyclerview拖拽自定义功能

Android - 在 RecyclerView 中滚动时颜色重复

在 Android Kotlin 的 recyclerView 中仅显示第一个项目并隐藏同名项目

单击后退按钮时,在 RecyclerView 中获得相同的项目位置