programing

어댑터로부터의 콜액티비티 메서드

elseif 2023. 4. 19. 22:25

어댑터로부터의 콜액티비티 메서드

에서 정의된 메서드를 호출할 수 있습니까?Activity부터ListAdapter?

(이것을 만들고 싶다.Buttonlist'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()adapteryourActivity

의:parentGroupViewGroupView

언급URL : https://stackoverflow.com/questions/12142255/call-activity-method-from-adapter