48

I have a method sendData() in my fragment. This method starts a new Activity. I want to call this method from my ArrayAdapter.

Here is my code:-

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;
    }

How can I do it?

user3713706
  • 1,243
  • 4
  • 15
  • 18
  • look this and you learn how to communicate Fragments : http://stackoverflow.com/questions/24081101/using-localbroadcastmanager-to-communicate-from-fragment-to-activity/24083101#24083101 – Umang Kothari Jul 01 '14 at 05:11

3 Answers3

171

Edit : Here is what I would use now. Older, "easier" solutions are available below.

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; 
    }

    ...

}

Now from any place in the adapter we can call listener.onEvent(data); to trigger the method in the fragment.

Moreover, instead of providing a listener through the constructor, we can add another method in the adapter such as registerListener(EventListener eventListener) and then maintain a list of listeners if needed.

Old Answer:

Solution 1 : Make the adapter an inner class of your fragment, so that you can call the method directly.

Solution 2 : Update your adapter constructor to accept the Fragment as a parameter.

Something like :

customAdapter = new CustomAdapter(myContext, android.R.layout.simple_list_item_1, getList, HomeFragment.this);

and update the constructor of the Adapter :

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

then you call methods using the fragment variable.

fragment.doSomething();
Shivam Verma
  • 7,973
  • 3
  • 26
  • 34
2

I know it's late to answer but There are 2 ways more to do it:

  1. You can also send broadcast from adapter and register it in fragment.

  2. Use interface. Refer this SO question for details.

Community
  • 1
  • 1
Faisal Shaikh
  • 3,900
  • 5
  • 40
  • 77
-4

You can make sendData method as static

public static void sendData(int position)
{
     ......
}

n call it as

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