无法在非活动,RecyclerView适配器类中显示对话框

时间:2018-04-24 06:06:29

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

我在我的Recyclerview中使用Fragment。我的RecyclerView有Adapter类。我需要在AlertDialog中用AdapterClass显示我用{{ 1}}。但我收到错误

  

android.app.Activity无法应用于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();
            }
        });

    }  

如何在此方法中显示对话框?

3 个答案:

答案 0 :(得分:3)

您需要在Context

中使用Activity代替AlertDialog.Builder
public void noInternetAlert(Activity activity)
{
    Context context = activity;
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    ....
}

答案 1 :(得分:2)

只需使用 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();
      }
});

答案 2 :(得分:2)

您已在适配器类中拥有上下文。您需要使用上下文来创建alertDialog。

首先删除此行

final AppCompatActivity activity=(AppCompatActivity)v.getContext();

然后在这里使用上下文。

final AlertDialog alertDialog=new AlertDialog.Builder(context).create();
final AlertDialog.Builder builder = new AlertDialog.Builder(context);

希望这会有所帮助。