Launch a Dialog Fragment on button click from a custom base adapter>getView [IMG INCLUDED]

13,534

Solution 1

When you create LazyAdapter pass in the view for which adapter is created or the parent fragment or ACtivity, and then in onclick method use this to call a function on your fragment or activity to show the dialog fragment, remember that from adapter class you should only be sending message through function calls to UI components to do something interesting like showing dialog fragments

Solution 2

I also struggled to access the Fragment Manager from an adapter in order to display a DialogFragment. Here is the solution in code:

public class YourPagerAdapter extends PagerAdapter{

   private Context context;

   public YourPagerAdapter(Context c) {
          this.context = c;
   }

   @Override
      public void onClick(View v) {
            FragmentActivity activity = (FragmentActivity)(context);
            FragmentManager fm = activity.getSupportFragmentManager();
            YourDialogFragment alertDialog = new YourDialogFragment();
            alertDialog.show(fm, "fragment_alert");
      }
}

The trick is that you receive the activity as context and you simply cast it to ensure it is a FragmentActivity - which is what the manager needs. This works because when you call YourPagerAdapter in your higher level file you pass the activity into it:

pagerAdapter = new YourPagerAdapter(getActivity());
yourViewPager.setAdapter(pagerAdapter);

Solution 3

I was trying to open a dialogfragment from a button located in a custom listview for an app that shows a list of events. I solved this by changing my adapter constructor.

In my adapter class:

public class EventAdapter extends BaseAdapter {

private Context context;
private ArrayList <Event> mEvents;
private FragmentManager fm;

public EventAdapter(Context context, ArrayList<Event> events, FragmentManager fm) {
    this.context = context;
    this.fm = fm;
    mEvents = events;
}

then I was able to do this:

        holder.saveButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            SignupFragment signupFragment = new SignupFragment();
            signupFragment.show(fm, "Sample Fragment");
            Log.i(TAG, "click on save button");
        }
    });

And i changed my adapter call in my higher up activity (AllEventsActivity):

    FragmentManager fm = getFragmentManager();
    mAdapter = new EventAdapter(this, mEvents, fm);
Share:
13,534
ChuckKelly
Author by

ChuckKelly

Mobile developer &amp; long time graphic designer with evil plans to take over the universe one key stoke at a time. Links: www.WhoisChuckKelly.com -Portfolio of some of my older design work , personal bio &amp; current skill sets

Updated on July 18, 2022

Comments

  • ChuckKelly
    ChuckKelly almost 2 years

    Alright so i have a list(which is also a fragment dialog) that displays a users friends and each item in that list has a button(labeled friends in the picture) and when users click that button id like to display another fragment dialog that displays all the options for interacting with that user(friend request, block, send private message ect...) the problem is that this button and its onClick listener are currently implemented via overriding my listview adapters getView method and to create a fragmentDialog requires access to fragment manager. is there a way to make this work?

    EDIT: I cannot post actual code from the project , but ive attached a simplified base adapter w. onClickListener that should make it clear what im trying to do . I cannot access the fragmentManager from a base adapter class to make the dialog fragment possible

    LazyAdapter.java
    package com.example.androidhive;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    
    import android.app.Activity;
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    public class LazyAdapter extends BaseAdapter {
    
        private Activity activity;
        private ArrayList&lt;HashMap&lt;String, String&gt;&gt; data;
        private static LayoutInflater inflater=null;
        public ImageLoader imageLoader;
    
        public LazyAdapter(Activity a, ArrayList&lt;HashMap&lt;String, String&gt;&gt; d) {
            activity = a;
            data=d;
            inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            imageLoader=new ImageLoader(activity.getApplicationContext());
        }
    
        public int getCount() {
            return data.size();
        }
    
        public Object getItem(int position) {
            return position;
        }
    
        public long getItemId(int position) {
            return position;
        }
    
        public View getView(int position, View convertView, ViewGroup parent) {
            View vi=convertView;
            if(convertView==null)
                vi = inflater.inflate(R.layout.list_row, null);
             Button requestBtn = (Button)vi.findViewById(R.id.title); // title
    
            HashMap&lt;String, String&gt; song = new HashMap&lt;String, String&gt;();
            song = data.get(position);
    
            // Setting all values in listview
            title.setText(song.get(CustomizedListView.KEY_TITLE));
            artist.setText(song.get(CustomizedListView.KEY_ARTIST));
            duration.setText(song.get(CustomizedListView.KEY_DURATION));
            imageLoader.DisplayImage(song.get(CustomizedListView.KEY_THUMB_URL), thumb_image);
    
            requestBtn.setOnClickListener(new myOnClickListener(position));
            return vi;
        }
    
            public class myOnClickListener implements OnClickListener{
         private int position;
      private String clicked_uid;
      public myOnClickListener(int position){
          this.position=position;
         }
      @Override
      public void onClick(View v) {
    
    
        //THIS IS WHERE IM TRYING TO PUT THE FRAGMENT DIALOG
    
            FragmentManager fm = TabHostFragmentActivity.this.getSupportFragmentManager();
            FriendsFamiliarsDialog friendsDialog = new FriendsFamiliarsDialog().newInstance(TabHostFragmentActivity.profile_uid,"friends");
            friendsDialog.show(fm, "friendsdialog");
    
    
    
    
    
      }
    
        }
    }
    

    listview fragment dialog getView android

  • ChuckKelly
    ChuckKelly over 10 years
    in my actual base adapter i do pass in context , but context alone cannot be used to access a fragment manager for some reason , can you post a example of ur solution? I think ull find the same problem as me
  • Pulkit Sethi
    Pulkit Sethi over 10 years
    Instead of passing in the context, pass your activity. lets say your classs id TestActivity pass this to constructor of adapter class. and inside the onclick method do mTestActivity.ShowDialogFragment(string data1, string data2);
  • ChuckKelly
    ChuckKelly over 10 years
    I figured it out about 2 mins after i responded ,but i did so via passing in a fragment manager in my base adapters constructor which worked....is there any advantages of passing the actual dialog fragment in the constructor instead of the fragment manager?
  • Pulkit Sethi
    Pulkit Sethi over 10 years
    You should not pass fragment manager as its connected to Activity thats y i wrote pass in the activity and call activity method (myactivity.showfragment), keep UI stuff in UI classes, this is just a better design incase you need to upgrade your stuff