Search code examples
androidlistviewfragmentonitemclicklistenerdialogfragment

Getting data from ListView in DialogFragment using onItemClick


I currently have a Fragment with an ImageButton that open up a DialogFragment. This DialogFragment is a custom list using an adapter where each entry has an ImageView and TextView.

Is it possible to return the "src" of the ImageView of the selected item to the Fragment that opened the DialogFragment? I need to change the src of the ImageButton to the selected image.

My main Fragment calling the DialogFragment:

ImageButton starter = (ImageButton) myView.findViewById(R.id.imageStarterItem);

starter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                //Here
                ItemPhysStarterFragment dialog = ItemPhysStarterFragment.newInstance();
                dialog.show(getFragmentManager(), "fragmentDialog");
            }
        });

My DialogFragment class containing the ListView:

public class ItemPhysStarterFragment extends DialogFragment {

    Button btn;
    ListView lv;
    SearchView sv;
    ArrayAdapter<String> adapter;
    String[] names={"Bumba's Mask", "Rangda's Mask", "Bluestone Pendant", "Death's Toll",
                    "Mark of the Vanguard", "Swift Wing", "War Flag", "Watcher's Gift"};
    int[] images={R.drawable.bumbas_mask, R.drawable.rangdas_mask, R.drawable.bluestone_pendant, R.drawable.deaths_toll,
                    R.drawable.mark_of_the_vanguard, R.drawable.swift_wing, R.drawable.war_flag, R.drawable.watchers_gift};

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View myView=inflater.inflate(R.layout.item_list, null);

        //SET TITLE DIALOG TITLE
        getDialog().setTitle("Starter Items");

        //BUTTON,LISTVIEW,SEARCHVIEW INITIALIZATIONS
        lv=(ListView) myView.findViewById(R.id.listView1);
        sv=(SearchView) myView.findViewById(R.id.searchView1);
        btn=(Button) myView.findViewById(R.id.dismiss);

        //CREATE AND SET ADAPTER TO LISTVIEW
        final Adapter adapter = new Adapter(getActivity(), this.getItems());
        lv.setAdapter(adapter);

        //SEARCH
        sv.setQueryHint("Search starter items..");
        sv.setOnQueryTextListener(new OnQueryTextListener() {
            public boolean onQueryTextSubmit(String txt) {
                return false;
            }
            public boolean onQueryTextChange(String txt) {
                adapter.getFilter().filter(txt);
                return false;
            }
        });

        //BUTTON
        btn.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                dismiss();
            }
        });

        return myView;
    }

    public static ItemPhysStarterFragment newInstance(){
        ItemPhysStarterFragment f = new ItemPhysStarterFragment();
        return f;
    }

    private ArrayList<Item> getItems() {

        ArrayList<Item> items = new ArrayList<Item>();
        Item item;

        for(int i = 0; i < names.length; i++)
        {
            item = new Item(names[i], images[i]);
            items.add(item);
        }

        return items;

    }


}

Solution

  • Create an interface first

    public interface OnListItemClickedListener {
        void onListItemClick(int resourceId);
    }
    

    Create setter for interface

    public class ItemPhysStarterFragment extends DialogFragment {
         OnListItemClickedListener mListener;
    
         public void setOnListItemSelectedListener(OnListItemClickedListener listener) {
             this.mListener = listener;
         }
    }
    

    Now set Listener to your fragment

    ItemPhysStarterFragment dialog = ItemPhysStarterFragment.newInstance();
    dialog.setOnListItemSelectedListener(new OnListItemClickedListener() {
                @Override
                public void onListItemClick(int resourceId) {
                    // User your resourceId
                }
            });
    dialog.show(getFragmentManager(), "fragmentDialog");
    

    Final step, trigger listener in your ItemPhysStarterFragment fragment's ListItemClick() -

    ...public void onListItemClick(int resourceId) {
            mListener.onListItemClick(pass your resource id);
       }