Вызов метода активности из адаптера
Можно ли вызвать метод, определенный в 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 предоставляет некоторую помощь.