어댑터로부터의 콜액티비티 메서드
에서 정의된 메서드를 호출할 수 있습니까?Activity
부터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
}
public onCreate(){
//your code
MyAdapter adapter = new MyAdapter(this); //this will work as your
//MyInterface listener
}
}
다음으로 액티비티를 ListAdater에 전달합니다.
public MyAdapter extends BaseAdater{
private MyInterface listener;
public MyAdapter(MyInterface listener){
this.listener = listener;
}
}
어댑터의 어딘가에서 액티비티 메서드를 호출할 필요가 있는 경우:
listener.foo();
오리지널:
현재의 답변은 이해하지만 좀 더 명확한 예가 필요했다.이 예에서는, E-메일·메일·메일·메일·메일을Adapter
(RecyclerView).어댑터) 및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();
}
}
기본적이고 심플합니다.
어댑터에서는, 이것을 사용해 주세요.
((YourParentClass) context).functionToRun();
Kotlin의 경우:
어댑터로 전화만 하면 됩니다.
(context as Your_Activity_Name).yourMethod()
한 가지 방법은 다음과 같습니다.
public void callBack()이라고 하는 메서드를 어댑터에 씁니다.
이제 활동 중인 어댑터에 대한 개체를 생성하는 동안 이 메서드를 재정의합니다.어댑터에서 메서드를 호출하면 재정의 메서드가 호출됩니다.
Myadapter adapter = new Myadapter() {
@Override
public void callBack() {
// dosomething
}
};
Kotlin에서는 이제 람다 기능을 사용하는 보다 깔끔한 방법이 제공되어 인터페이스가 필요하지 않습니다.
class MyAdapter(val adapterOnClick: (Any) -> Unit) {
fun setItem(item: Any) {
myButton.setOnClickListener { adapterOnClick(item) }
}
}
class MyActivity {
override fun onCreate(savedInstanceState: Bundle?) {
var myAdapter = MyAdapter { item -> doOnClick(item) }
}
fun doOnClick(item: Any) {
}
}
Kotlin의 경우 다음과 같은 작업을 수행할 수 있습니다.
if(context is MainActivity){ context.functionToCall(values) }
if (parent.getContext() instanceof yourActivity) {
//execute code
}
에서는 '이 '활동'이 '실행할 수 '라고 되어 있을 때 을 실행할 수 .GroupView
에서 하는 것getView()
adapter
yourActivity
의:parent
GroupViewGroupView
언급URL : https://stackoverflow.com/questions/12142255/call-activity-method-from-adapter
'programing' 카테고리의 다른 글
시스템 입수 방법창문들.'참'을 반환하려면 ShowDialog()를 선택하십시오. (0) | 2023.04.19 |
---|---|
vba의 열 번호를 사용하여 Excel 범위를 생성하시겠습니까? (0) | 2023.04.19 |
힌트 텍스트를 WPF 텍스트 상자에 추가하려면 어떻게 해야 합니까? (0) | 2023.04.19 |
Scroll Viewer를 자동으로 스크롤하는 방법 - 사용자가 스크롤 위치를 변경하지 않은 경우에만 (0) | 2023.04.14 |
PowerShell에서 파일 버전 가져오기 (0) | 2023.04.14 |