Android onBindViewFolder中的AlertDialog用于从卡视图弹出

Android onBindViewFolder中的AlertDialog用于从卡视图弹出,android,android-recyclerview,android-alertdialog,android-cardview,Android,Android Recyclerview,Android Alertdialog,Android Cardview,我不是很高级的开发人员。目前,我正在开发一个应用程序,其中必须从卡中的可点击图像调用alertdialog。我是这样发展的: public class patient_detailsAdapter extends RecyclerView.Adapter<patient_detailsAdapter.patientDetailsViewHolder>{ ArrayList<patient_details> patientDetailList = new Arra

我不是很高级的开发人员。目前,我正在开发一个应用程序,其中必须从卡中的可点击图像调用alertdialog。我是这样发展的:

public class patient_detailsAdapter extends RecyclerView.Adapter<patient_detailsAdapter.patientDetailsViewHolder>{

    ArrayList<patient_details> patientDetailList = new ArrayList<patient_details>();
    Context mContext;

    public patient_detailsAdapter(ArrayList<patient_details> patientDetailList, Context mContext){

        this.patientDetailList = patientDetailList;
        this.mContext = mContext;

    }

    @Override
    public patientDetailsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.patient_list_layout,parent,false);
        patientDetailsViewHolder patientDetailsViewHolder = new patientDetailsViewHolder(view);

        return patientDetailsViewHolder;
    }

    @Override
    public void onBindViewHolder(final patientDetailsViewHolder holder, int position) {

        patient_details patient = patientDetailList.get(position);
        holder.person_img.setImageResource(patient.getPatientImage());
        holder.person_name.setText(patient.getName());
        holder.person_email.setText(patient.getEmail());
        holder.callButtonImage.setImageResource(patient.getCallButtonImage());

        holder.callButtonImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new AlertDialog.Builder(mContext)
                        .setTitle("ABC")
                        .setMessage("bhnshsks")
                        .setIcon(R.drawable.call_now)
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                Log.i("Result","Success");
                            }
                        })
                        .setNegativeButton("No", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                Log.i("Result","Success");
                            }
                        })
                        .show();

            }
        });
    }

    @Override
    public int getItemCount() {
        return patientDetailList.size();
    }

    public static class patientDetailsViewHolder extends RecyclerView.ViewHolder{

        ImageView person_img,callButtonImage;
        TextView person_email,person_name;

        public patientDetailsViewHolder(View view){
            super(view);

            person_img = (ImageView) view.findViewById(R.id.profile_image);
            person_email = (TextView) view.findViewById(R.id.profile_email);
            person_name = (TextView) view.findViewById(R.id.profile_name);
            callButtonImage = (ImageView) view.findViewById(R.id.callButton);


        }

    }
}
为了使用alert dialog的v7小部件,我给它赋予了主题:

holder.callButtonImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.MyAlertDialogStyle);
            builder.setTitle("AppCompatDialog");
            builder.setMessage("Lorem ipsum dolor...");
            builder.setPositiveButton("OK", null);
            builder.setNegativeButton("Cancel", null);
            builder.show();

        }
    });
然后我得到了一个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
但最重要的是,当我删除alert dialog并用Log.I测试onclickListener时,我获得了成功

请帮忙,我到处都找了,但没找到有用的东西。 提前谢谢

编辑

我的活动是:

public class PatientListActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener{

private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
private ArrayList<patient_details> list ;
private Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_patient_list);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    list = new ArrayList<patient_details>();

    preparValue();

    layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setHasFixedSize(true);
    adapter = new patient_detailsAdapter(list,context);
    recyclerView.setAdapter(adapter);
   }private void preparValue(){

    int[] images = new int[]{ R.drawable.abc, R.drawable.efg, R.drawable.efr};
    int[] buttonImage = new int[]{R.drawable.call_now};
    patient_details a = new patient_details(images[0],"abc@xyz.com","ABC_Name",buttonImage[0]);
    list.add(a);

    patient_details b = new patient_details(images[1],"efg@xyz.com","EFG_Name",buttonImage[0]);
    list.add(b);

    patient_details c = new patient_details(images[2],"efr@xyz.com","Leonardo Di Caprio",buttonImage[0]);
    list.add(c);

}
公共类PatientListActivity扩展了AppCompatActivity
实现NavigationView.OnNavigationItemSelectedListener{
私人回收站;
专用循环视图适配器;
private RecyclerView.LayoutManager LayoutManager;
私有数组列表;
私人语境;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u patient\u list);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
recyclerView=(recyclerView)findViewById(R.id.recyclerView);
列表=新的ArrayList();
准备值();
layoutManager=新的LinearLayoutManager(此);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(true);
适配器=新患者\详细信息适配器(列表、上下文);
recyclerView.setAdapter(适配器);
}私有值(){
int[]images=newint[]{R.drawable.abc,R.drawable.efg,R.drawable.efr};
int[]buttonImage=newint[]{R.drawable.call_now};
患者详细信息a=新患者详细信息(图像[0],”abc@xyz.com“,“ABC_名称”,按钮图像[0]);
列表.添加(a);
患者详细信息b=新患者详细信息(图像[1],”efg@xyz.com“,“EFG_名称”,按钮图像[0]);
列表.添加(b);
患者详细信息c=新患者详细信息(图像[2],”efr@xyz.com“,“莱昂纳多·迪卡普里奥”,按钮图像[0]);
增加(c)项;
}

这是我实例化类的活动。

在适配器构造函数中传递的上下文为null。 您的活动扩展了上下文,因此您应该在
PatientListActivity
中执行以下操作:

adapter = new patient_detailsAdapter(list,this);
而不是:

adapter = new patient_detailsAdapter(list,context);

在适配器构造函数中传递的上下文为null。 您的活动扩展了上下文,因此您应该在
PatientListActivity
中执行以下操作:

adapter = new patient_detailsAdapter(list,this);
而不是:

adapter = new patient_detailsAdapter(list,context);

请在创建适配器的地方发布代码我已经发布了我在其中实现对话框的适配器代码发布了你的活动/片段代码,你在其中实例化了它发布了,你能建议我解决方案/发布代码吗请不要xmlPost创建适配器的代码我已经发布了我在其中实现di的适配器代码A将您的活动/片段代码发布到实例化它的地方,您能建议我解决方案/发布代码吗?请不要发布XML谢谢!节省了我的时间!我不知道它对适配器的影响。就像我看到的,alertDialog应该在适配器类(onBIndViewFolder)中实现一样你能解释一下bro吗?如果你不明确它内部使用的主题
context.getTheme()
,您的上下文为null,它会生成一个NullPointerException。如果您不想更改默认值,则无需添加主题。非常感谢!节省了我的时间!我不了解它对适配器的影响。正如我所看到的,alertDialog应该在适配器类(onBIndViewFolder)中实现你能解释一下bro吗?发生的事情是,如果你没有明确它在内部使用的主题
context.getTheme()
,你的上下文是空的,它会产生一个NullPointerException。如果你不想更改默认值,你不需要添加主题