127

Activityfromで定義されているメソッドを呼び出すことはできListAdapterますか?

Button(行を作成したいのですがlist's、このボタンをクリックすると、対応するアクティビティで定義されているメソッドを実行する必要があります。自分で設定しようとしonClickListenerましたListAdapterが、このメソッドを呼び出す方法がわかりません。そのパスは何ですか。 ..)

使用Activity.this.method()すると、次のエラーが発生します。

No enclosing instance of the type Activity is accessible in scope

何か案が ?

4

9 に答える 9

319

はい、できます。

アダプタで新しい Field を追加します。

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

これで完了です。この呼び出しメカニズムを必要としないアクティビティにこのアダプターを使用する必要がある場合、コードは実行されません (チェックが失敗した場合)。

于 2012-08-27T13:00:18.097 に答える
137

あなたはこのようにそれを行うことができます:

インターフェイスを宣言します:

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

そして、アダプターのどこかで、そのActivityメソッドを呼び出す必要がある場合:

listener.foo();
于 2012-08-27T13:02:42.347 に答える
75

オリジナル:

現在の回答は理解していますが、より明確な例が必要でした。( RecyclerView.Adapter Adapter) と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();
    }
}
于 2014-12-31T05:54:07.810 に答える
7

もう1つの方法は::

public void callBack(){} と言うように、アダプタにメソッドを記述します。

アクティビティでアダプタのオブジェクトを作成しているときに、このメソッドをオーバーライドします。アダプタでメソッドを呼び出すと、オーバーライド メソッドが呼び出されます。

Myadapter adapter = new Myadapter() {
  @Override
  public void callBack() {
    // dosomething
  }
};
于 2015-05-20T09:21:13.543 に答える