首页 > 解决方案 > 单击recyclerview的项目时如何创建对话框?

问题描述

我正在尝试创建一个功能,一旦用户单击回收器视图,就会弹出一个对话框,但我遇到了如下所述的错误。当我尝试初始化 AlertDialog.build 并将this其作为参数放置时,它显示错误。我曾尝试使用其他一些参数,例如上下文、getActivity。但错误仍然相同。

在此处输入图像描述

下面的代码是我的完整代码

package com.example.tuitioncentre;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.Observable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.firestore.DocumentSnapshot;

public class myadapter_tutorlist extends FirebaseRecyclerAdapter<User,myadapter_tutorlist.myviewholder> {

    AlertDialog.Builder builder;


    public myadapter_tutorlist(@NonNull FirebaseRecyclerOptions<User> options) {
        super(options);
    }

    @Override
    protected void onBindViewHolder(@NonNull final myviewholder holder, int position, @NonNull final User model) {

        holder.name.setText("Tutor's Name:" + model.getUsername());
        holder.phone.setText("Phone No:" + model.getPhone());
        holder.email.setText("Email:" + model.getEmail());
        holder.status.setText("Status: " + model.getActive().toString());
        builder = new AlertDialog.Builder(this);
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View v) {
                //Toast.makeText(v.getContext(),model.getUsername(),Toast.LENGTH_SHORT).show();

                builder.setMessage(R.string.dialog_message) .setTitle(R.string.dialog_title);
                builder.setMessage("Do you want to activate tutor account ?")
                        .setCancelable(false)
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                Toast.makeText(v.getContext(),"you choose yes action for alertbox", Toast.LENGTH_SHORT).show();
                            }
                        })
                        .setNegativeButton("No", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                //  Action for 'NO' Button
                                dialog.cancel();
                                Toast.makeText(v.getContext(),"you choose no action for alertbox", Toast.LENGTH_SHORT).show();
                            }
                        });
                //Creating dialog box
                AlertDialog alert = builder.create();
                //Setting the title manually
                alert.setTitle("AlertDialogExample");
                alert.show();
            }
        });
    }
    @NonNull
    @Override
    public myviewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //put singlerow xml into view holder
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.singlerow,parent,false);
        return new myviewholder(view);
    }


    class myviewholder extends RecyclerView.ViewHolder{
        TextView name,phone,email,status;
        public myviewholder(@NonNull View itemView) {
            super(itemView);
            name=(TextView)itemView.findViewById(R.id.nametext);
            phone=(TextView)itemView.findViewById(R.id.phonetext);
            email=(TextView)itemView.findViewById(R.id.emailtext);
            status=(TextView)itemView.findViewById(R.id.statustext);
        }
        
    }
}

标签: javaandroid

解决方案


AlertDialog.Builder(this);当您尝试传递适配器的引用时,传递“this”将不起作用。

有两种正确的方法可以实现这一点:

添加一个变量来引用您的 Activity,就像Activity mActivity;在您的 Adapter 类中一样。然后,在您初始化适配器的活动类中,您可以将活动上下文作为“this”传递。您可以使用 Adapter 类中的构造函数或 Activity 类中的构造函数来实现它,adapter一旦初始化访问mActivity变量并设置它,就使用您的实例。

或者,您可以使用视图接口并在您的活动中实现它,覆盖该方法以在您的活动中显示 AlertDialog。然后在您的适配器中添加该接口的引用变量,SomeInterface mInfterface;并以上述相同的方式在您的 Activity 类中对其进行初始化。然后您可以调用该方法来显示 AlertDialog 并将数据从适配器传递给该方法以显示所有信息,例如 -

mInterface.showAlertDialog(model);

推荐阅读