如何在ListView Adapter类中获取Activity参考?

时间:2018-08-29 10:50:06

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

我试图在单击按钮时要求从列表适配器类中获得电话许可,这需要将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));

        }

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

谢谢。

3 个答案:

答案 0 :(得分:3)

在Adapter类中具有Activity的引用是一种不好的方法。在活动类中应该执行的任何操作,例如UI更改,显示对话框等,都不应该在活动之外的其他任何地方执行。

解决方案:
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) 
     }
}

答案 1 :(得分:1)

如果您确定mContext的类型为Activity,就可以像这样投射它

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

答案 2 :(得分:0)

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