Вызов метода активности из адаптера


можно ли вызвать метод, который определен в Activity С ListAdapter?

(Я хочу сделать Button на list's строка и когда эта кнопка нажата, она должна выполнить метод, который определен в соответствующей деятельности. Я пытался установить onClickListener в своем ListAdapter но я не знаю, как назвать этот метод, в чем его путь...)

когда я использовал Activity.this.method() Я получаю следующую ошибку:

No enclosing instance of the type Activity is accessible in scope

Есть Идеи ?

7 90

7 ответов:

Да, вы можете.

в адаптере добавить новое поле:

private Context mContext;

в конструкторе адаптера добавьте следующий код:

public AdapterName(......,Context context){
//your code.
this.mContext=context;
}

в getView(...) адаптера:

Button btn=(Button)convertView.findViewById(yourButtonId);
btn.setOnClickListener(new Button.OnClickListener() {

        @Override
        public void onClick(View v) {
            if(mContext instanceof YourActivityName){
                ((YourActivityName)mContext).yourDesiredMethod();
            }
        }
    });

замените свои собственные имена классов, где вы видите свой код, свою деятельность и т. д.

Если вам нужно использовать этот же адаптер для более чем одного вида деятельности, то :

создать интерфейс

public interface IMethodCaller{
    void yourDesiredMethod();
}

реализовать этот интерфейс в действиях, которые вы должны иметь эту функцию вызова метода.

затем в адаптере getView (), вызовите как :

Button btn=(Button)convertView.findViewById(yourButtonId);

btn.setOnClickListener(new Button.OnClickListener() {

    @Override
    public void onClick(View v) {
        if(mContext instanceof IMethodCaller){
            ((IMethodCaller)mContext).yourDesiredMethod();
        }
    }
});

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

вы можете сделать это так:

объявить интерфейс:

public interface MyInterface{
    public void foo();
}

пусть ваша активность реализации это:

public class MyActivity extends Activity implements MyInterface{
    public void foo(){
        //do stuff
    }
}

затем передайте свою активность в ListAdater:

public MyAdapter extends BaseAdater{
    private MyInterface listener;

    public MyAdapter(MyInterface listener){
        this.listener = listener;
    }
}

и где-то в адаптере, когда вам нужно вызвать этот метод активности:

listener.foo();

Оригинал:

я понимаю текущий ответ, но нужен более четкий пример. Вот пример того, что я использовал с Adapter(RecyclerView.Адаптер) и Activity.

в вашей деятельности:

это позволит использовать тег interface что мы имеем в нашем Adapter. В этом примере, он будет вызван, когда пользователь нажимает на элемент RecyclerView.

public class MyActivity extends Activity implements AdapterCallback {

    private MyAdapter mMyAdapter;

    @Override
    public void onMethodCallback() {
       // do something
    }

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.mMyAdapter = new MyAdapter(this);
    }
}

в вашем адаптере:

на Activity мы инициировали наши Adapter и передал это в качестве аргумента в конструктор. Это будет инициировать наш interface для нашего метода обратного вызова. Вы можете видеть, что мы используем наш метод обратного вызова для пользовательских кликов.

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private AdapterCallback mAdapterCallback;

    public MyAdapter(Context context) {
        try {
            this.mAdapterCallback = ((AdapterCallback) context);
        } catch (ClassCastException e) {
            throw new ClassCastException("Activity must implement AdapterCallback.");
        }
    }

    @Override
    public void onBindViewHolder(final MyAdapter.ViewHolder viewHolder, final int i) {
        // simple example, call interface here
        // not complete
        viewHolder.itemView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    mAdapterCallback.onMethodCallback();
                } catch (ClassCastException exception) {
                   // do something
                }
            }
        });
    }

    public static interface AdapterCallback {
        void onMethodCallback();
    }
}

Basic и простой.

в вашем адаптере просто используйте это.

((YourParentClass) контексте).functionToRun ();

еще один способ::

написать метод в адаптере позволяет сказать общественного недействительными обратного вызова(){}.

теперь при создании объекта для адаптера в activity переопределите этот метод. Переопределение метод будет вызван при вызове метода в адаптере.

     Myadapter adapter = new Myadapter(){

                 @override
                 public void callBack(){
                    // dosomething
                 }
   };
if(parent.getContext() instanceof yourActivity){
//execute code
}

это условие позволит вам выполнить что-то, если деятельность, которая имеет GroupView что запрашивает представления из getView() метод adapter - это yourActivity

Примечание : parent Это GroupView

Для Котлин:

в вашем адаптере, просто позвоните

(context as Your_Activity_Name).your_method_name()