Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android将recyclerview项位置传递给对话框按钮侦听器_Android_Android Recyclerview_Onclicklistener - Fatal编程技术网

android将recyclerview项位置传递给对话框按钮侦听器

android将recyclerview项位置传递给对话框按钮侦听器,android,android-recyclerview,onclicklistener,Android,Android Recyclerview,Onclicklistener,单击recyclerview项中的按钮时,将显示具有多个按钮(cancalButton、deleteButton)的对话框 所以我做了两个监听器(cancelListener,deleteListener) Show dialog成功,cancelListener运行良好,但我无法在DeltelListener中执行我想要的操作 我想在用户单击对话框中的删除按钮时删除firebase中的数据 因此,我必须知道单击recyclerview项查找数据的位置。(因为我可以通过从array.get(po

单击recyclerview项中的按钮时,将显示具有多个按钮(cancalButton、deleteButton)的对话框

所以我做了两个监听器(cancelListener,deleteListener)

Show dialog成功,cancelListener运行良好,但我无法在DeltelListener中执行我想要的操作

我想在用户单击对话框中的删除按钮时删除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();
    }
};

}

因为您的方法
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();
    }
}