Как получить ссылку Activity в классе адаптера ListView? - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь запросить разрешение на телефонный звонок у класса адаптера списка одним нажатием кнопки, для которой в качестве первого аргумента требуется действие.

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

        }

это полный код слушателя нажатия кнопки.

Thankyou.

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Передать контекст 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);
0 голосов
/ 29 августа 2018

Наличие ссылок на Activity в классе Adapter - плохой подход. Все, что должно быть сделано в классе действия, такое как изменения пользовательского интерфейса, отображение диалогового окна и т. Д., Не должно выполняться где-либо еще, кроме самого действия.

Решение:
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) 
     }
}
0 голосов
/ 29 августа 2018

Если вы уверены, что mContext имеет тип Activity, просто приведите его вот так

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