Android 如何在ListView适配器类中获取活动引用?

Android 如何在ListView适配器类中获取活动引用?,android,listview,android-activity,android-context,listadapter,Android,Listview,Android Activity,Android Context,Listadapter,我试图通过单击一个按钮从列表适配器类请求电话呼叫权限,该按钮需要活动作为第一个参数 ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.CALL_PHONE},1 ); 这里,mContext是从一个活动传递的。但它显示出错误: Wrong 1st argument type. Found: 'android.content.Context', required: 'android.app.

我试图通过单击一个按钮从列表适配器类请求电话呼叫权限,该按钮需要活动作为第一个参数

 ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.CALL_PHONE},1 );
这里,mContext是从一个活动传递的。但它显示出错误:

Wrong 1st argument type. Found: 'android.content.Context', required: 'android.app.Activity'.
我试图传递每个上下文以及getParent()活动,但它不起作用。 有没有办法获取活动并在列表适配器中使用它

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                dialNumber(employee.get(i).getNumber());
                }
            else
                {

                    Log.i(TAG, "onClick: you don't have permission to call");
                    ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.CALL_PHONE},1 );
                }

                Log.i(TAG, "onClick: Wroks " + getItemId(i));

        }
这是按钮单击侦听器的完整代码


谢谢。

如果您确定mContext是Activity类型的,就这样强制转换它

ContextCompat.checkSelfPermission((Activity) mContext, Manifest.permission.CALL_PHONE)

如果您确定mContext是Activity类型,只需像这样强制转换它

ContextCompat.checkSelfPermission((Activity) mContext, Manifest.permission.CALL_PHONE)

将活动上下文传递给适配器构造函数

像这样//假设你在活动中工作

 ListAdapter listAdapter = new ListAdapter(this)
在适配器中

 public class ListAdapter extends BaseAdapter {
        Context context;
        LayoutInflater layoutInflater;

        public ListAdapter (Context context) {
            this.context = context;
     }
现在在适配器中使用所需的上下文

ContextCompat.checkSelfPermission((Activity) context, Manifest.permission.CALL_PHONE);

将活动上下文传递给适配器构造函数

像这样//假设你在活动中工作

 ListAdapter listAdapter = new ListAdapter(this)
在适配器中

 public class ListAdapter extends BaseAdapter {
        Context context;
        LayoutInflater layoutInflater;

        public ListAdapter (Context context) {
            this.context = context;
     }
现在在适配器中使用所需的上下文

ContextCompat.checkSelfPermission((Activity) context, Manifest.permission.CALL_PHONE);

在适配器类中引用活动是一种糟糕的方法。任何应该在activity类内完成的操作,如UI更改、显示对话框等,都不应该在其他任何地方完成,而应该从activity本身完成

解决方案:
1) 创建一个接口

public interface MyListener {
     void doSomething(Params... params);
}
2) 在活动类中实现它

class MyActivity extends AppCompatActivity implements MyListener{ 
       new MyAdapter(this);  

       void doSomething(Params... params){
             //Request Permission here
       }
}
3) 在适配器类中这样使用

class MyAdapter extends .....{
      MyListener myListener;

      MyAdapter(Context mContext){
           if(mContext instanceOf MyListener)
                 myListener = (MyListener) mContext;
      }

      void anotherFunction(){
             myListener.doSomething(Params... params) 
     }
}

在适配器类中引用活动是一种糟糕的方法。任何应该在activity类内完成的操作,如UI更改、显示对话框等,都不应该在其他任何地方完成,而应该从activity本身完成

解决方案:
1) 创建一个接口

public interface MyListener {
     void doSomething(Params... params);
}
2) 在活动类中实现它

class MyActivity extends AppCompatActivity implements MyListener{ 
       new MyAdapter(this);  

       void doSomething(Params... params){
             //Request Permission here
       }
}
3) 在适配器类中这样使用

class MyAdapter extends .....{
      MyListener myListener;

      MyAdapter(Context mContext){
           if(mContext instanceOf MyListener)
                 myListener = (MyListener) mContext;
      }

      void anotherFunction(){
             myListener.doSomething(Params... params) 
     }
}

ActivityCompat.requestPermissions实际上需要活动实例,而不是上下文。将
mContext
Context的类型更改为活动。我也尝试了,但没有工作在适配器类中创建接口并从活动传递回调。所以,点击按钮,回调将进入活动,现在您可以传递任何您想要的上下文。您是在活动中还是在片段中?如果上下文来自某个活动,则可以通过执行(活动)将其强制转换为活动mContext@NicolaGallazzi列出适配器classActivityCompat.requestPermissions实际上需要的是活动实例,而不是上下文。将
mContext
Context的类型更改为活动。我也尝试了,但没有工作在适配器类中创建接口并从活动传递回调。所以,点击按钮,回调将进入活动,现在您可以传递任何您想要的上下文。您是在活动中还是在片段中?如果上下文来自某个活动,则可以通过执行(活动)将其强制转换为活动mContext@NicolaGallazzi列表适配器classi必须请求权限检查工作正常。我必须请求权限检查工作正常。