【问题标题】:How to get Activity reference in ListView Adapter class?如何在 ListView Adapter 类中获取 Activity 引用?
【发布时间】:2019-02-04 03:15:06
【问题描述】:

我正在尝试通过单击需要 Activity 作为第一个参数的按钮从列表适配器类请求电话呼叫权限。

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

这里的 mContext 是从其中一个活动传递的。但它显示错误:

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

我尝试传递每个上下文以及 getParent() 活动,但它不起作用。 有什么方法可以获取 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));

        }

这是按钮点击监听器的完整代码。

谢谢。

【问题讨论】:

  • ActivityCompat.requestPermissions 实际上需要活动实例而不是上下文。将mContext Context 的类型更改为Activity。
  • 我也试过了,但是不行
  • 在您的适配器类中创建一个接口并从活动中传递一个回调。所以在按钮点击回调将来到活动,现在你可以传递任何你想要的上下文。
  • 您是在活动中还是在片段中?如果上下文来自一个活动,您可以通过 (Activity) mContext 将其转换为活动
  • @NicolaGallazzi 列出适配器类

标签: android listview android-activity android-context listadapter


【解决方案1】:

在 Adapter 类中引用 Activity 是一种不好的方法。应在 Activity 类中完成的任何操作,例如 UI 更改、显示对话框等,都不应在其他任何地方完成,只能从 Activity 本身完成。

解决方案:
1) 创建接口

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

2) 在Activity类中实现

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

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

3) 在Adapter类中这样使用

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

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

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

【讨论】:

    【解决方案2】:

    如果您确定 mContext 是 Activity 类型,只需像这样投射它

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

    【讨论】:

    • 我必须请求权限检查工作正常。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      private Context context;
      private ArrayList<String> pathsList;
      private Activity activity;
      
      public Adapter(Context context, Activity activity, ...) {
          this.context = context;
          this.activity = activity;
          ...
      }
      

      然后在你的代码中使用这个活动:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多