[android] 어댑터에서 활동 메소드 호출

Activityfrom에 정의 된 메서드를 호출 할 수 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
}

이 조건은 귀하 GroupViewgetView()메소드 에서 요청하는 뷰 를 가진 활동 adapteryourActivity

참고 : parent그 GroupView입니다