Adam Arcaro
Adam Arcaro

Reputation: 471

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;

    }


}

Upvotes: 2

Views: 2009

Answers (3)

JustLearning
JustLearning

Reputation: 3332

This link was helpful to me in achieving the same result as proposed by @Wizzard.

It is basically proposing the same solution, except there is not need to create a custom interface.

  1. In your fragment class create a variable and setter method to accept OnItemClickListener

    private android.widget.AdapterView.OnItemClickListener onItemClickListener;
    

    public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
    this.onItemClickListener = onItemClickListener;
    }

  2. In the fragement class make sure the listView sets the item click listener:

    list.setOnItemClickListener(onItemClickListener);

  3. Finally in you main class you can call the listviewItemClickListener:

    DialogMyListFragment df = new DialogMyListFragment().getInstance();
    df.setOnItemClickListener(listener);

Upvotes: 1

Paresh
Paresh

Reputation: 6857

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

Upvotes: 4

Silva2351
Silva2351

Reputation: 342

You can declare an interface

public interface OnCustomItemClickListener {
    void onItemClicked(final String src);
}

and implement that interface when creating your dialog

(...),new OnCustomItemClickListener() {
                        @Override
                        public void onItemClicked() {
                        //do something
                        }
                    }, (...)

and handle it appropriately on your ItemPhysStarterFragment class

Upvotes: 0

Related Questions