7

我有一个ListFragment和一个自定义适配器。

从适配器中,我onClick从行中定义的按钮获取事件。在onClick方法中,我得到了一些 id,我想将其传递给ListFragment做一些事情。

如何ListFragment从适配器中调用方法 showTask?

列表片段

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 回答