Amr SubZero
Amr SubZero

Reputation: 1276

How to pass an ArrayList from Activity to a Fragment

What I'm trying to do is send an ArrayList<String> from an Activity to a ListFragment.

So I can use the Fragments in a TableLayout.

It's not necessary to use a ListFragment, I can use any type of Fragment, but I'm trying to get the idea.

Here's my MainActivity:

FragmentTransaction fragmentTransaction;

ArrayList<String> namesArray = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    namesArray.add("Android");
    namesArray.add("Iphone");
    namesArray.add("Windows Phone");

    Bundle bundle = new Bundle();
    bundle.putStringArrayList("valuesArray", namesArray);
    namesFragment myFragment = new namesFragment();
    myFragment.setArguments(bundle);

    fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.add(R.id.main_container, new namesFragment());
    fragmentTransaction.commit();

}

My ListFragment:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    ArrayList<String> values = getArguments().getStringArrayList("valuesArray");

    ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, values);

    setListAdapter(adapter);
}

This code above gives me:

Unfortunately app has stopped.

So how can I achieve something like that?

Upvotes: 1

Views: 12040

Answers (2)

Andre Classen
Andre Classen

Reputation: 4017

You are instantiating your Fragment twice.

Just change your code to:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    namesArray.add("Android");
    namesArray.add("Iphone");
    namesArray.add("Windows Phone");
    Bundle bundle = new Bundle();
    bundle.putStringArrayList("valuesArray", namesArray);
    namesFragment myFragment = new namesFragment();
    myFragment.setArguments(bundle);
    fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.add(R.id.main_container, myFragment);
    fragmentTransaction.commit();
}

Upvotes: 9

Arslan Sohail
Arslan Sohail

Reputation: 1713

Not the answer but you can avoid creating a Fragment Transaction object by replacing last three lines with this

getSupportFragmentManager()
.beginTransaction()
.add(R.id.main_container, new namesFragment())
.commit();

Upvotes: -2

Related Questions