Activity
from에 정의 된 메서드를 호출 할 수 ListAdapter
있습니까?
(난을 만들고 싶어 Button
에서 list's
행이 버튼을 클릭하면, 그것은 활동 대응에 정의 된 방법을 수행해야합니다. 나는 세트에 시도 onClickListener
내에서 ListAdapter
하지만 나는 그것의 경로 무엇이 메소드를 호출하는 방법을 모르겠어요. ..)
사용할 때 Activity.this.method()
다음 오류가 발생합니다.
No enclosing instance of the type Activity is accessible in scope
어떤 아이디어?
답변
그래 넌 할수있어.
어댑터에서 새 필드 추가 :
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();
}
}
});
완료되었습니다. 이 호출 메커니즘이 필요하지 않은 활동에이 어댑터를 사용해야하는 경우 코드가 실행되지 않습니다 (확인에 실패한 경우).
답변
다음과 같이 할 수 있습니다.
인터페이스 선언 :
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();
답변
실물:
나는 현재 답변을 이해하지만 더 명확한 예가 필요했습니다. 다음은 Adapter
(RecyclerView.Adapter) 및 Activity
.
활동에서 :
이것은 interface
우리가 가지고있는 Adapter
. 이 예에서는 사용자가 .NET Framework의 항목을 클릭 할 때 호출됩니다 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
하고 constructer에 인수로이를 통과시켰다. 이것은 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();
}
}
답변
기본적이고 간단합니다.
어댑터에서 이것을 사용하십시오.
((YourParentClass) context).functionToRun();
답변
또 다른 방법은 다음과 같습니다.
어댑터에 메소드를 작성하면 public void callBack () {}을 말할 수 있습니다.
이제 활동중인 어댑터에 대한 개체를 만드는 동안이 메서드를 재정의합니다. 어댑터에서 메서드를 호출하면 Override 메서드가 호출됩니다.
Myadapter adapter = new Myadapter() {
@Override
public void callBack() {
// dosomething
}
};
답변
Kotlin의 경우 :
어댑터에서 간단히
(context as Your_Activity_Name).yourMethod()
답변
if (parent.getContext() instanceof yourActivity) {
//execute code
}
이 조건은 귀하 GroupView
의 getView()
메소드 에서 요청하는 뷰 를 가진 활동 adapter
이yourActivity
참고 : parent
그 GroupView입니다
![](http://daplus.net/wp-content/uploads/2023/04/coupang_part-e1630022808943-2.png)