web-dev-qa-db-ja.com

アダプターからFragmentメソッドを呼び出す

フラグメントにsendData()メソッドがあります。このメソッドは、新しいアクティビティを開始します。 ArrayAdapterからこのメソッドを呼び出したいです。

ここに私のコードがあります-

HomeFragment.Java

stagAdaper = new StaggeredAdapter(myContext, Android.R.layout.simple_list_item_1, getList);
            mGridView.setAdapter(stagAdaper);
    private void sendData(int position)
    {

        myDialog = new ProgressDialog(myContext).show(getActivity(), "Fetching news..", "Just a moment");

        myDialog.getWindow().setContentView(R.layout.openarticlewaitprogress);
        myDialog.getWindow().setTitle("Loading..");
        myDialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
         new  NewsDetails(myDialog);



            Intent nIntent = new Intent(getActivity(),Details.class);

               String Body=getList.get(position).getBody();

            newsIntent.putExtra("Body", Body);


            startActivity(nIntent);

    }

StaggeredAdapter.Java

viewHolder.layGridLayout.setOnClickListener(new View.OnClickListener() 
    {

        @Override
        public void onClick(View v) 
        {
            // TODO Auto-generated method stub
            //viewHolder.layGridLayout.setForeground(R.drawable.foreground_selector);

        }
    });
    return convertView;
    }

どうすればいいですか?

37
user3713706

編集:ここで私が今使用するものです。以前の「より簡単な」ソリューションを以下に示します。

_MyFragment extends Fragment implements CustomAdapter.EventListener {

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        CustomAdapter adapter = new CustomAdapter(..., this);

    }

    void onEvent(int data) {
        doSomething(data);
    }

}

CustomAdapter extends BaseAdapter {

    EventListener listener; 

    public interface EventListener {
        void onEvent(int data);   
    }

    public CustomAdapter(..., EventListener listener) {
        this.listener = listener; 
    }

    ...

}
_

これで、アダプターの任意の場所からlistener.onEvent(data);を呼び出して、フラグメント内のメソッドをトリガーできます。

さらに、コンストラクターを介してリスナーを提供する代わりに、registerListener(EventListener eventListener)などの別のメソッドをアダプターに追加し、必要に応じてリスナーのリストを維持できます。

旧回答:

解決策1:アダプターをフラグメントの内部クラスにして、メソッドを直接呼び出すことができるようにします。

解決策2:フラグメントをパラメーターとして受け入れるようにアダプターコンストラクターを更新します。

何かのようなもの :

_customAdapter = new CustomAdapter(myContext, Android.R.layout.simple_list_item_1, getList, HomeFragment.this);
_

アダプターのコンストラクターを更新します。

_public CustomAdapter(Context context, int id, HomeFragment fragment) {
    this.fragment = fragment;
}
_

次に、フラグメント変数を使用してメソッドを呼び出します。

_fragment.doSomething();
_
134
Shivam Verma

私は答えるのが遅いことを知っていますが、それを行うには2つの方法があります:

  1. broadcastからadapterを送信して、fragmentに登録することもできます。

  2. インターフェイスを使用します。 this SOの質問を参照してください。

1
Faisal Shaikh