Search code examples
androidlistviewfragmentandroid-listfragment

Listview do not show up in Fragment


I created a Listview inside a Fragment but when I executed the app, the ListView do not appear on the screen. There is no crashes. I have a textview and a listview. The Textview shows up but the listview dont.

Code for fragment:

public class PlayerFragment extends Fragment {
private List<Station> myStation = new ArrayList<Station>();
private LayoutInflater mInflater;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view =  inflater.inflate(R.layout.fragment_player,
             null);

    populateStationList();
    myStation.add(new Station("station1", "url1", R.drawable.station1, "station1 description"));
    myStation.add(new Station("station2", "url2", R.drawable.station2, "station2 description"));
    myStation.add(new Station("station3", "url3", R.drawable.station3, "station3 description"));

    populateListView();
    ArrayAdapter<Station> adapter = new MyListAdapter();
    ListView list = (ListView) view.findViewById(R.id.stationListView);
    list.setAdapter(adapter);

    registerClickCallback();
    list = (ListView) view.findViewById(R.id.stationListView);
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View viewClicked,
                                int position, long id) {
            Station clickedStation = myStation.get(position);
            String message = "You clicked position " + position
                    + "\n" + "Station: " + clickedStation.getStationName();
            Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show();
        }
    });

    return inflater.inflate(R.layout.fragment_player, container, false);
}

private class MyListAdapter extends ArrayAdapter<Station> {
    public MyListAdapter() {
        super(getActivity(), R.layout.station_list_view, myStation);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Make sure we have a view to work with (may have been given null)
        View itemView = convertView;
        if (itemView == null) {
            itemView = mInflater.inflate(R.layout.station_list_view, parent, false);
        }

        // Find the car to work with.
        Station currentStation = myStation.get(position);

        // Fill the view
        ImageView imageView = (ImageView) itemView.findViewById(R.id.item_icon);
        imageView.setImageResource(currentStation.getStationAlbum());

        TextView stationName = (TextView) itemView.findViewById(R.id.item_station_name_text_view);
        stationName.setText(currentStation.getStationName());

        TextView stationURL = (TextView) itemView.findViewById(R.id.item_url_text_view);
        stationURL.setText("" + currentStation.getStationURL());

        TextView stationDescription = (TextView) itemView.findViewById(R.id.item_description_text_view);
        stationDescription.setText(currentStation.getStationDescription());

        return itemView;
        }
    }
}

XML for fragment:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/playerFragment"
    tools:context="com.brandonong.sgpradio.PlayerFragment">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="heysdadasdasdadasdasd"
        android:id="@+id/textview1"/>
    <ListView
        android:id="@+id/stationListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textview1" >
    </ListView>
</RelativeLayout>

Solution

  • The problem is, besides the layout inflation inflater.inflate(R.layout.fragment_player, container, false); all the other code should be placed inside onViewCreated. Try this and see if it works !

    Edit:

    Your onCreateView:

    return inflater.inflate(R.layout.fragment_player, container, false);

    OnViewCreated:

     populateStationList();
        myStation.add(new Station("station1", "url1", R.drawable.station1, "station1 description"));
        myStation.add(new Station("station2", "url2", R.drawable.station2, "station2 description"));
        myStation.add(new Station("station3", "url3", R.drawable.station3, "station3 description"));
    
        populateListView();
        ArrayAdapter<Station> adapter = new MyListAdapter();
        ListView list = (ListView) view.findViewById(R.id.stationListView);
        list.setAdapter(adapter);
    
        registerClickCallback();
        list = (ListView) view.findViewById(R.id.stationListView);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View viewClicked,
                                    int position, long id) {
                Station clickedStation = myStation.get(position);
                String message = "You clicked position " + position
                        + "\n" + "Station: " + clickedStation.getStationName();
                Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show();
            }
        });
    

    And btw, I'd really recommend you to see this post to check out the ViewHolder pattern, which improves a lot your ListView performance!