7

ListFragmentカスタムアダプタがあります。

アダプターからonClick、行で定義されたボタンからイベントを取得します。このonClickメソッドでは、いくつかのIDを取得します。これをに渡して、ListFragment何かを実行します。

ListFragmentアダプタからメソッドshowTaskを呼び出すにはどうすればよいですか?

listfragment

public class TaskListFragment extends ListFragment{

    /* ... */

    @Override
    public void onCreate(Bundle savedInstanceState) {       
        super.onCreate(savedInstanceState);
        mAdapter = new TaskListAdapter(getActivity(), data);        
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) 
    {
        super.onActivityCreated(savedInstanceState);
        setListAdapter(mAdapter);
    }   

    public void showTask(long id) {

        FragmentTransaction ft = getFragmentManager().beginTransaction();

        TaskFragment taskFragment = new TaskFragment();

        Bundle args = new Bundle();
        args.putLong("id", id);
        taskFragment.setArguments(args);

        ft.replace(R.id.fragment_container, taskFragment);
        ft.commit();         
    }
}

アダプタ

public class TaskListAdapter extends ArrayAdapter<Task>{

    /* ... */

    private OnClickListener mOnClickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            long id = (Integer) v.getTag();
            // how can I call showTask(id) ?
        }
    };
}
4

2 に答える 2

16

一般的な解決策は、アダプターをフラグメントの内部クラスにすることです。これにより、アダプターはメソッドを直接呼び出すことができます。

または、フラグメント(またはフラグメントによって実装されたインターフェイス)をコンストラクターを介してアダプターに渡します。

于 2013-03-01T15:18:45.683 に答える
15

次のようにアダプタを作成します。

@Override
public void onCreate(Bundle savedInstanceState) {       
    super.onCreate(savedInstanceState);
    mAdapter = new TaskListAdapter(getActivity(), data, TaskListFragment.this);        
}

これにより、アダプターコンストラクターが次のように変更されます。

public TaskListAdapter(Context context, List<Task> data, TastListFragment fragment) {
    this.fragment = fragment;
}

これで、TaskListFragmentを指すオブジェクトができました。

private OnClickListener mOnClickListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        long id = (Integer) v.getTag();
        fragment.showTask(id);
    }
};
于 2013-03-01T15:19:11.463 に答える