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

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

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

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

No enclosing instance of the type Activity is accessible in scope

Любая идея?

Ответ 1

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

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

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

Внедрите этот интерфейс в действия, требуемые для вызова этого метода.

Затем в Adapter 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();
        }
    }
});

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

Ответ 2

Вы можете сделать это следующим образом:

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

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

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

listener.foo();

Ответ 3

Оригинал:

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

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

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

public class MyActivity extends Activity implements AdapterCallback {

    private MyAdapter myAdapter;

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

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

        myAdapter = new MyAdapter(this);
    }
}

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

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

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

    private AdapterCallback adapterCallback;

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

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

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

Ответ 4

Основной и простой.

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

((YourParentClass) context).functionToRun();

Ответ 5

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

Напишите способ в вашем адаптере, скажем, public void callBack() {}.

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

     Myadapter adapter = new Myadapter(){

                 @override
                 public void callBack(){
                    // dosomething
                 }
   };

Ответ 6

Для Котлина:

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

(context as Your_Activity_Name).your_method_name()

Ответ 7

if(parent.getContext() instanceof yourActivity){
//execute code
}

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

ПРИМЕЧАНИЕ: parent - это GroupView

Ответ 8

MainActivity с невидимой кнопкой ADDTOCART, MainActivity с Viewpager с фрагментами и фрагментами, если какой-либо из recyclerview из фрагмента щелкнут видимым. Mainactivity addtocartbutton pleae предоставляет некоторую помощь.