从Adapter调用Fragment方法

48

我在我的碎片中有一个sendData()方法。这个方法会启动一个新的Activity。我想从我的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;
    }

我该如何做?


看这个,你就能学会如何在Fragment之间进行通信: http://stackoverflow.com/questions/24081101/using-localbroadcastmanager-to-communicate-from-fragment-to-activity/24083101#24083101 - Umang Kothari
3个回答

171

编辑: 这是我现在会使用的方法。下面还提供了一些旧的“简单”解决方案。

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

我尝试了这个。但是我在ProgressDialog变量处得到了一个NullPointerException。 - user3713706
@user3713706 这个解决方案必须能够工作,请发布您的logcat,也许您在其他地方有错误。 - Shayan Pourvatan
2
@Shivam 它起作用了,在其他地方有问题。谢谢。 - user3713706
非常感谢!这个解决方案是我碰到的最好、最简单的一个。 - Tanuj Dhaundiyal
1
如果我选择方案2,当片段被销毁时,它会从内存中释放吗?这是因为我担心片段保留适配器,而适配器保留片段(循环)。 - Khant Thu Linn
显示剩余2条评论

2

我知道现在回答有点晚了,不过还有两种方法可以实现:

  1. 你也可以从适配器中发送,并在fragment中注册它。

  2. 使用接口。参考这个Stack Overflow问题获取详细信息。


这个值得考虑。 - Stack Overflow

-4
你可以将sendData方法设为静态
public static void sendData(int position)
{
     ......
}

可以称之为n调用

@Override
public void onClick(View v) 
{
     // TODO Auto-generated method stub
     HomeFragment.sendData(position)
     ........    
}

如果我这样做,就无法访问getActivity()。 - user3713706
你可以使用 myContext 替代。 - qulfille

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接