首页 > 解决方案 > 如何在 ListView Adapter 类中获取 Activity 引用?

问题描述

我试图通过单击需要将 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));

        }

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

谢谢你。

标签: androidlistviewandroid-activityandroid-contextlistadapter

解决方案


在 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)在适配器类中这样使用

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

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

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

推荐阅读