如何从适配器调用ListFragment中定义的方法?

时间:2013-03-01 15:15:05

标签: android adapter

我有一个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) ?
        }
    };
}

2 个答案:

答案 0 :(得分:16)

一个常见的解决方案是将适配器作为片段的内部类,因此它可以直接调用该方法。

或者,通过其构造函数将片段(或片段实现的某些接口)传递给适配器。

答案 1 :(得分: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);
    }
};