I had an activity with a Listview containing text and green squares. I finally changed my mind and modified my code to use a fragment instead of an activity. But then my text color changed and I can't see the green squares anymore. I didn't changed anything in my list code or the color of the text so I don't understand what's happening.
Thank you for your help.
MainActivity is only used as a fragment container :
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FragmentManager fm = getSupportFragmentManager();
        Fragment fragment = fm.findFragmentById(R.id.ll_container);
        if (fragment == null) {
            fragment = new PollutionLevelsFragment();
            fm.beginTransaction()
                    .add(R.id.ll_container, fragment)
                    .commit();
        }
    }
}
MainActivity layout
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/ll_container"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
The fragment class
public class PollutionLevelsFragment extends Fragment implements PollutionLevelsFragmentMVP.View {
    private PollutionLevelAdapter plAdapter;
    @BindString(R.string.city)
    String city;
    @BindString(R.string.aqicn_token)
    String authToken;
    @BindView(R.id.lv_pollution_levels)
    ListView lvPollutionLevels;
    @Inject
    PollutionLevelsFragmentMVP.Presenter presenter;
    private ViewModel pollutionData;
    private ArrayList<String> testbidon;
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_pollution_levels, container, false);
        ButterKnife.bind(this,view);
        // Construct the data source
        ArrayList<PollutionLevel> arrayOfPollutionLevel = new ArrayList<>();
        // Create the adapter to convert the array to views
        plAdapter = new PollutionLevelAdapter(getActivity().getApplicationContext(), arrayOfPollutionLevel);
        lvPollutionLevels.setAdapter(plAdapter);
        return view;
    }
    @Override
    public void onStart() {
        super.onStart();
        presenter.setView(this);
        presenter.loadData(city, authToken);
    }
    @Override
    public void onStop() {
        super.onStop();
        presenter.rxUnsubscribe();
    }
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ((App) getActivity().getApplication()).getComponent().inject(this);
    }
    @Override
    public void updateData(ViewModel viewModel) {
        this.pollutionData = viewModel;
        ArrayList<PollutionLevel> pollutionLevels = viewModel.getAllPolluants();
        for(PollutionLevel pl : pollutionLevels) {
            plAdapter.add(pl);
        }
    }
}
The fragment layout
 <FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView android:id="@+id/lv_pollution_levels"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>
The ArrayAdapter for the ListView
public class PollutionLevelAdapter extends ArrayAdapter<PollutionLevel> {
@BindView(R.id.tv_name)
TextView tvName;
@BindView(R.id.tv_value)
TextView tvValue;
public PollutionLevelAdapter(Context context, ArrayList<PollutionLevel> pollutionLevels) {
    super(context,0,pollutionLevels);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item_pollution, parent, false);
    }
    View view = convertView;
    ButterKnife.bind(this,view);
    PollutionLevel pollutionLevel = getItem(position);
    tvName.setText(pollutionLevel.getName());
    tvValue.setText(pollutionLevel.getValue());
    return view;
}
}
My list item
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:orientation="horizontal"
          android:layout_width="match_parent"
          android:layout_height="match_parent">
<ImageView
    android:id="@+id/iv_warning"
    android:layout_width="20dp"
    android:layout_height="20dp"
    app:srcCompat="@drawable/rectangle"/>
<TextView
    android:id="@+id/tv_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:gravity="center_vertical"
    android:text="TextView"/>
<TextView
    android:id="@+id/tv_value"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:gravity="center_vertical"
    android:text="TextView"/>
This is the code of the layout the Activity class that rendered the Listview correctly (so before I switched from an activity to a fragment). I didn't put the code of the Listview adapter here since it didn't change :
Activity
public class PollutionLevelsActivity extends AppCompatActivity implements PollutionLevelsActivityMVP.View {
    private PollutionLevelAdapter plAdapter;
    @BindString(R.string.city)
    String city;
    @BindString(R.string.aqicn_token)
    String authToken;
    @BindView(R.id.lv_pollution_levels)
    ListView lvPollutionLevels;
    @Inject
    PollutionLevelsActivityMVP.Presenter presenter;
    private ViewModel pollutionData;
    private ArrayList<String> testbidon;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((App) getApplication()).getComponent().inject(this);
        ButterKnife.bind(this);
    // Construct the data source
    ArrayList<PollutionLevel> arrayOfPollutionLevel = new ArrayList<>();
    // Create the adapter to convert the array to views
    plAdapter = new PollutionLevelAdapter(this, arrayOfPollutionLevel);
    lvPollutionLevels.setAdapter(plAdapter);
    }
    @Override
    protected void onStart() {
        super.onStart();
        presenter.setView(this);
        presenter.loadData(city, authToken);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        presenter.rxUnsubscribe();
    }
    @Override
    public void updateData(ViewModel viewModel) {
        this.pollutionData = viewModel;
        ArrayList<PollutionLevel> pollutionLevels = viewModel.getAllPolluants();
        for(PollutionLevel pl : pollutionLevels) {
            plAdapter.add(pl);
        }
    }
}
Layout
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.livos.citypollution.pollutionlevels.PollutionLevelsActivity">
    <ListView
        android:id="@+id/lv_pollution_levels"
        android:layout_width="368dp"
        android:layout_height="495dp"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
