如何在 ListView Adapter class 中获取 Activity 引用?

How to get Activity reference in ListView Adapter class?

我正在尝试通过单击需要 Activity 作为第一个参数的按钮从列表适配器 class 请求 phone 调用权限。

 ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.CALL_PHONE},1 );

这里的 mContext 是从 activity 之一传递过来的。但它显示错误:

Wrong 1st argument type. Found: 'android.content.Context', required: 'android.app.Activity'.

我试图传递每个上下文以及 getParent() activity 但它不起作用。 有没有办法获取 Activity 并在列表适配器中使用它?

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)

将 Activity 上下文传递给 Adapter 构造函数

像这样 // 假设你在 activity

工作
 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);

在适配器 class 中引用 Activity 是一种糟糕的方法。任何应该在 activity class 中完成的事情,例如 UI 更改、显示对话框等,都不应在其他任何地方完成,而只能在 activity 本身中完成。

解法:
1) 创建接口

public interface MyListener {
     void doSomething(Params... params);
}

2) 在Activityclass

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

       void doSomething(Params... params){
             //Request Permission here
       }
}

3) 在 Adapter 中这样使用 class

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

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

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

以上答案非常有用,但如果上下文没有转换为 activity 并且应用程序在运行时崩溃,就像我的情况一样,那么您也可以通过适配器 [= 的构造函数传递 activity 19=]像这样。

private Context context;
private ArrayList<String> pathsList;
private Activity activity;

public Adapter(Context context, Activity activity, ...) {
    this.context = context;
    this.activity = activity;
    ...
}

然后在您的代码中使用此 activity:

ContextCompat.checkSelfPermission(activity, 
Manifest.permission.CALL_PHONE);