java - 单击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);
}
}
}
解决方案
AlertDialog.Builder(this);
当您尝试传递适配器的引用时,传递“this”将不起作用。
有两种正确的方法可以实现这一点:
添加一个变量来引用您的 Activity,就像Activity mActivity;
在您的 Adapter 类中一样。然后,在您初始化适配器的活动类中,您可以将活动上下文作为“this”传递。您可以使用 Adapter 类中的构造函数或 Activity 类中的构造函数来实现它,adapter
一旦初始化访问mActivity
变量并设置它,就使用您的实例。
或者,您可以使用视图接口并在您的活动中实现它,覆盖该方法以在您的活动中显示 AlertDialog。然后在您的适配器中添加该接口的引用变量,SomeInterface mInfterface;
并以上述相同的方式在您的 Activity 类中对其进行初始化。然后您可以调用该方法来显示 AlertDialog 并将数据从适配器传递给该方法以显示所有信息,例如 -
mInterface.showAlertDialog(model);
推荐阅读
- javascript - CKEditor:如何在文本部分粘贴 url 时删除自动嵌入行为(4.7 版)
- ios - Swift Google Maps SDK,在我的应用程序内导航
- javascript - 通过属性javascript计算数组对象侧面数组中的对象
- webgl - 如何动态地将对象添加到场景中?
- python - 在 Python 中将交互列表转换为矩阵
- powershell - 基于时间的while循环
- git - 有没有办法让一个存储库由来自两个复制的存储库的文件组成,这些存储库继续从 github 上的两个独立存储库更新?
- javascript - 等待后,console.log 不返回异步结果
- python - 无法删除“Unmamed:”行
- c# - 将 SQL 日期时间与 C# DateTime.Now 进行比较