android - 无法在非 Activity 、RecyclerView 适配器类中显示对话框

标签 android android-fragments android-recyclerview android-context android-dialog

我在我的 Fragment 中使用 Recyclerview。我的 RecyclerView 有 Adapter 类。我需要显示 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);
           }  

这是适配器类的代码

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();
      }
});

关于android - 无法在非 Activity 、RecyclerView 适配器类中显示对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49994483/

相关文章:

android - Cordova 2.7.0 PushPlugin "cordova cannot be resolved"和 "ctx cannot be resolved"

android - 在方向更改时更改 RecyclerView 布局仅适用于第一个 View

android - 在 recyclerview 中设置 Adapter

android - 如何设置 RecyclerView 应用程序 :layoutManager ="" from XML?

android - 在 fragment 中更新 RecyclerView 时的 scrollToPosition()

Android M Preview 3 模拟器 native 浏览器崩溃

android - 使用 ADB 获取文件的最后修改时间戳

android - 如何接收收取0 $的订单? Google Developer Console

android - 在 Activity 或 fragment 中初始化房间数据库?

java - 回收站 View + 卡片 View : Inflating Wrong Data