无法在非 Activity、RecyclerView 适配器 Class 中显示对话框
Not able to show Dialog box in Non Activity, RecyclerView Adapter Class
我在 Fragment
中使用 Recyclerview
。我有 Adapter
class 因为我的 RecyclerView.I 需要在其中显示 AlertDialog
我在 AdapterClass
中编写的方法。但是我收到一个错误
android.app.Activity cannot be applied to android.content.Context.
这是我的 AlertClass
的代码
public class AlertClass {
public void noInternetAlert(Activity activity)
{
final AlertDialog alertDialog=new AlertDialog.Builder(activity).create();
AlertDialog.Builder builder=new AlertDialog.Builder(activity);
builder.setTitle("No Internet Connection");
builder.setMessage("You need to have Mobile data or Wifi to access this.");
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
alertDialog.cancel();
}
});
builder.show();
}
}
这是我在 AdapterClass
中的方法的代码
private void free() {
AlertClass alert=new AlertClass();
alert.noInternetAlert(context);
}
这是适配器的代码 Class
public class BusyAdapter extends RecyclerView.Adapter<BusyAdapter.ViewHolder>
{
private FragmentManager fm;
private FragmentTransaction tx;
private String myToken,name,join,description,id;
private ArrayList<BusyEntry> entry;
Context context;
public BusyAdapter(ArrayList<BusyEntry> entry,Context context)
{
this.entry = entry;
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.busy_card,parent,false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
final BusyEntry currentEntry=entry.get(position);
holder.name.setText(currentEntry.getName());
holder.description.setText(currentEntry.getDescription());
holder.id.setText(currentEntry.getId());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int pos=holder.getAdapterPosition();
name=entry.get(position).getName();
join=entry.get(position).getJoin();
description=entry.get(position).getDescription();
id=entry.get(position).getId();
final AppCompatActivity activity=(AppCompatActivity)v.getContext();
final AlertDialog alertDialog=new AlertDialog.Builder(activity).create();
final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Confirmation");
builder.setMessage("Do you really want to Free?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
free();
String chooseTab="";
ChooseTab chooseTab1=new ChooseTab();
fm=activity.getSupportFragmentManager();
Busy busy=new Busy();
tx=fm.beginTransaction();
tx.replace(R.id.frame,chooseTab1,chooseTab);
tx.detach(myentry);
tx.attach(myebtry);
entry.remove(pos);
notifyItemRemoved(pos);
tx.commit();
}
});
builder.setNegativeButton("No", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {
alertDialog.cancel();
}
});
builder.show();
}
});
}
如何在该方法中显示对话框?
只需使用 v.getContext 像这样更改 AlertDialog.Builder alertDialog = new AlertDialog.Builder(v.getContext);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(v.getContext);
// Setting Dialog Title
alertDialog.setTitle("Confirm Delete...");
// Setting Dialog Message
alertDialog.setMessage("Are you sure you want delete this?");
// Setting Icon to Dialog
alertDialog.setIcon(R.drawable.delete);
// Setting Positive "Yes" Button
alertDialog.setPositiveButton("YES", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int which) {
free();
String chooseTab="";
ChooseTab chooseTab1=new ChooseTab();
fm=activity.getSupportFragmentManager();
Busy busy=new Busy();
tx=fm.beginTransaction();
tx.replace(R.id.frame,chooseTab1,chooseTab);
tx.detach(myentry);
tx.attach(myebtry);
entry.remove(pos);
notifyItemRemoved(pos);
tx.commit();
}
});
// Setting Negative "NO" Button
alertDialog.setNegativeButton("NO", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Write your code here to invoke NO event
dialog.cancel();
}
});
// Showing Alert Message
alertDialog.show();
}
});
您需要在 AlertDialog.Builder
中使用 Context
而不是 Activity
public void noInternetAlert(Activity activity)
{
Context context = activity;
AlertDialog.Builder builder = new AlertDialog.Builder(context);
....
}
您已经在适配器中有了上下文 class。您需要使用上下文来创建 alertDialog。
先去掉这一行
final AppCompatActivity activity=(AppCompatActivity)v.getContext();
然后在这里使用上下文。
final AlertDialog alertDialog=new AlertDialog.Builder(context).create();
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
希望这会有所帮助。
我在 Fragment
中使用 Recyclerview
。我有 Adapter
class 因为我的 RecyclerView.I 需要在其中显示 AlertDialog
我在 AdapterClass
中编写的方法。但是我收到一个错误
android.app.Activity cannot be applied to android.content.Context.
这是我的 AlertClass
public class AlertClass {
public void noInternetAlert(Activity activity)
{
final AlertDialog alertDialog=new AlertDialog.Builder(activity).create();
AlertDialog.Builder builder=new AlertDialog.Builder(activity);
builder.setTitle("No Internet Connection");
builder.setMessage("You need to have Mobile data or Wifi to access this.");
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
alertDialog.cancel();
}
});
builder.show();
}
}
这是我在 AdapterClass
private void free() {
AlertClass alert=new AlertClass();
alert.noInternetAlert(context);
}
这是适配器的代码 Class
public class BusyAdapter extends RecyclerView.Adapter<BusyAdapter.ViewHolder>
{
private FragmentManager fm;
private FragmentTransaction tx;
private String myToken,name,join,description,id;
private ArrayList<BusyEntry> entry;
Context context;
public BusyAdapter(ArrayList<BusyEntry> entry,Context context)
{
this.entry = entry;
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.busy_card,parent,false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
final BusyEntry currentEntry=entry.get(position);
holder.name.setText(currentEntry.getName());
holder.description.setText(currentEntry.getDescription());
holder.id.setText(currentEntry.getId());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int pos=holder.getAdapterPosition();
name=entry.get(position).getName();
join=entry.get(position).getJoin();
description=entry.get(position).getDescription();
id=entry.get(position).getId();
final AppCompatActivity activity=(AppCompatActivity)v.getContext();
final AlertDialog alertDialog=new AlertDialog.Builder(activity).create();
final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Confirmation");
builder.setMessage("Do you really want to Free?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
free();
String chooseTab="";
ChooseTab chooseTab1=new ChooseTab();
fm=activity.getSupportFragmentManager();
Busy busy=new Busy();
tx=fm.beginTransaction();
tx.replace(R.id.frame,chooseTab1,chooseTab);
tx.detach(myentry);
tx.attach(myebtry);
entry.remove(pos);
notifyItemRemoved(pos);
tx.commit();
}
});
builder.setNegativeButton("No", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {
alertDialog.cancel();
}
});
builder.show();
}
});
}
如何在该方法中显示对话框?
只需使用 v.getContext 像这样更改 AlertDialog.Builder alertDialog = new AlertDialog.Builder(v.getContext);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(v.getContext);
// Setting Dialog Title
alertDialog.setTitle("Confirm Delete...");
// Setting Dialog Message
alertDialog.setMessage("Are you sure you want delete this?");
// Setting Icon to Dialog
alertDialog.setIcon(R.drawable.delete);
// Setting Positive "Yes" Button
alertDialog.setPositiveButton("YES", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int which) {
free();
String chooseTab="";
ChooseTab chooseTab1=new ChooseTab();
fm=activity.getSupportFragmentManager();
Busy busy=new Busy();
tx=fm.beginTransaction();
tx.replace(R.id.frame,chooseTab1,chooseTab);
tx.detach(myentry);
tx.attach(myebtry);
entry.remove(pos);
notifyItemRemoved(pos);
tx.commit();
}
});
// Setting Negative "NO" Button
alertDialog.setNegativeButton("NO", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Write your code here to invoke NO event
dialog.cancel();
}
});
// Showing Alert Message
alertDialog.show();
}
});
您需要在 AlertDialog.Builder
Context
而不是 Activity
public void noInternetAlert(Activity activity)
{
Context context = activity;
AlertDialog.Builder builder = new AlertDialog.Builder(context);
....
}
您已经在适配器中有了上下文 class。您需要使用上下文来创建 alertDialog。
先去掉这一行
final AppCompatActivity activity=(AppCompatActivity)v.getContext();
然后在这里使用上下文。
final AlertDialog alertDialog=new AlertDialog.Builder(context).create();
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
希望这会有所帮助。