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


Answers

그래 넌 할수있어.

어댑터에서 새 필드 추가 :

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();
        }
    }
});

너 끝났어. 이 호출 메커니즘이 필요하지 않은 활동에이 어댑터를 사용해야하는 경우 코드가 실행되지 않습니다 (점검에 실패한 경우).

Question

ListAdapter Activity 정의 된 mathod를 호출 할 수 있습니까?

( list's 행에 Button 을 만들고 싶을 때이 버튼을 클릭하면 현재 Activity에 정의 된 메서드를 수행해야합니다 ListAdapter 에서 onClickListener 를 설정하려고했지만이 메서드를 호출하는 방법을 모르겠습니다. 그 길 ...)

Activity.this.method() 사용할 때 다음 오류가 발생합니다.

No enclosing instance of the type Activity is accessible in scope

어떤 아이디어?




다음과 같이 할 수 있습니다.

선언 인터페이스 :

public interface MyInterface{
    public void foo();
}

귀하의 활동 imlement 그것을 보자 :

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();



if(parent.getContext() instanceof yourActivity){
//execute code
}

이 조건은 adaptergetView() 메소드에서보기를 요청하는 GroupView 가있는 활동이 GroupView 경우 작업을 수행 할 수있게합니다

참고 : parent 는 GroupView입니다.




또 하나의 방법은 ::

어댑터에 public void callBack () {}과 같은 메서드를 작성합니다.

이제 액티비티에서 어댑터에 대한 객체를 생성하는 동안이 메소드를 오버라이드한다. 메서드에서 어댑터를 호출하면 재정의 메서드가 호출됩니다.

     Myadapter adapter = new Myadapter(){

                 @override
                 public void callBack(){
                    // dosomething
                 }
   };



MainActivity with ADDTOCART 버튼이 보이지 않습니다. MainActivity는 조각과 fragmentadapters가있는 Viewpager가 있습니다. 조각의 recyclerview가 클릭되면 표시됩니다. Mainactivity addtocartbutton pleae가 도움이됩니다.




실물:

나는 현재의 대답을 이해하지만 더 명확한 예가 필요했다. 다음은 Adapter (RecyclerView.Adapter) 및 Activity 와 함께 사용한 예제입니다.

활동 내 :

그러면 Adapter 에있는 interface 가 구현됩니다. 이 예제에서는 사용자가 RecyclerView 에서 항목을 클릭 할 때 호출됩니다.

public class MyActivity extends Activity implements AdapterCallback {

    private MyAdapter mMyAdapter;

    @Override
    public void onMethodCallback() {
       // do something
    }

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.mMyAdapter = new MyAdapter(this);
    }
}

어댑터에서 :

Activity 에서 우리는 Adapter 시작하여 이것을 생성자에게 인수로 전달했습니다. 이렇게하면 콜백 메서드에 대한 interface 가 시작됩니다. 사용자가 클릭 할 때 콜백 메소드를 사용한다는 것을 알 수 있습니다.

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private AdapterCallback mAdapterCallback;

    public MyAdapter(Context context) {
        try {
            this.mAdapterCallback = ((AdapterCallback) context);
        } catch (ClassCastException e) {
            throw new ClassCastException("Activity must implement AdapterCallback.");
        }
    }

    @Override
    public void onBindViewHolder(final MyAdapter.ViewHolder viewHolder, final int i) {
        // simple example, call interface here
        // not complete
        viewHolder.itemView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    mAdapterCallback.onMethodCallback();
                } catch (ClassCastException exception) {
                   // do something
                }
            }
        });
    }

    public static interface AdapterCallback {
        void onMethodCallback();
    }
}



기본적이고 간단합니다.

어댑터에서 간단하게 이것을 사용하십시오.

((YourParentClass) 컨텍스트) .functionToRun ();