Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call a Fragment method from an Adapter

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?

like image 988
user3713706 Avatar asked Jul 01 '14 04:07

user3713706


People also ask

How to call fragment method in adapter Android?

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. then you call methods using the fragment variable.

Can I call fragment method from activity?

I see in the Android Fragments Dev Guide that an "activity can call methods in a fragment by acquiring a reference to the Fragment from FragmentManager, using findFragmentById() or findFragmentByTag() ."


2 Answers

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(); 
like image 100
Shivam Verma Avatar answered Oct 19 '22 09:10

Shivam Verma


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.

like image 43
Faisal Shaikh Avatar answered Oct 19 '22 11:10

Faisal Shaikh