Как отобразить список во фрагменте

#java #android #xml

Вопрос:

Я хочу создать фрагмент с помощью ListView, поэтому у меня есть ListView с элементом listitem в моей активности фрагмента, но мой элемент listitem не отображается, когда я открываю свой фрагмент, мне нужна помощь с ним, как отобразить элементы во фрагменте? Когда я делаю этот список в действии, все работает хорошо, как это исправить? Мой код здесь:

FollowFragment.java

 public class FollowFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        getActivity().setTitle("Подписки");
        return inflater.inflate(R.layout.fragment_follow,container,false);
    }
}
 

follow_fragment.xml

 <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp">

    <ListView
        android:id="@ id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:listitem="@layout/item_follow"/>

</FrameLayout>
 

item_follow.xml

 <?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView 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="wrap_content"
    android:layout_marginStart="16dp"
    android:layout_marginTop="16dp"
    android:layout_marginEnd="16dp">


    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@ id/favourite_match_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="8dp">


        <androidx.appcompat.widget.AppCompatTextView
            android:id="@ id/team_1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:fontFamily="@font/roboto_medium"
            android:text="FC Chelsea"
            android:textColor="@color/black"
            tools:ignore="MissingConstraints" />

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@ id/team_2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:fontFamily="@font/roboto_medium"
            android:text="Manchester City"
            app:layout_constraintTop_toBottomOf="@ id/team_1"
            android:textColor="@color/black"
            tools:ignore="MissingConstraints" />

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@ id/match_date"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:fontFamily="@font/roboto"
            android:text="25 сентября 2021 года"
            android:textColor="@color/colorGrey"
            android:textSize="12sp"
            app:layout_constraintTop_toBottomOf="@id/team_2"
            tools:ignore="MissingConstraints" />


        <ImageButton
            android:layout_width="48dp"
            android:layout_height="50dp"
            android:layout_marginEnd="24dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:src="@drawable/ic_love"
            android:background="#00000000"
            app:layout_constraintLeft_toRightOf="@id/team_2"
            app:layout_constraintTop_toTopOf="parent" />


    </androidx.constraintlayout.widget.ConstraintLayout>


</androidx.cardview.widget.CardView>
 

Ответ №1:

ну, это потому, что вы еще не назначили ему адаптер с правильными данными.

  • ваш адаптер должен расширить ArrayAdapter и переопределить getView , в котором вы должны настроить представление с правильным содержимым на основе ваших данных.

как может выглядеть адаптер :

 public class MyAdapter extends ArrayAdapter<YourDataCustomClassHere> {
    ArrayList<YourDataClassHere> data;
    Context context ;
    public MyAdapter(@NonNull Context context, int resource, @NonNull ArrayList<YourDataCustomClassHere> objects) {
        super(context, resource, objects);
        this.data = objects;
        this.context = context;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        if (convertView == null) {
            convertView = ((LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.item_follow, parent, false);
        }
        //example on setting one of your fields 
        ((AppCompatTextView) convertView.findViewById(android.R.id.team_1))
                .setText(data.get(position).getText());
        //set Other Fields here
        return convertView;
    }
}

 

там, где ваш класс данных должен быть пользовательским классом, который содержит правильную информацию для каждого элемента в списке, и getText в data.get(position).getText() котором есть произвольный метод, я предположил, что он будет в вашем пользовательском классе, чтобы получить какой-то текст, но вы можете заменить его тем, что хотите.

  • затем в вашем onCreateView вы должны установить адаптер в свой ListView следующим образом :
 public class FollowFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        getActivity().setTitle("Подписки");
        View rootView= inflater.inflate(R.layout.fragment_follow,container,false);
        ListView list = rootView.findViewById(R.id.listview);
        MyAdapter myadapter = new MyAdapter(getContext(),R.layout.item_follow,YourDataArrayListHere);
        list.setAdapter(myadapter);
        return rootView; 
    }
}
 

Я верю, что вы найдете свой путь и замените свой dataarraylisthere правильным списком ArrayList вашего пользовательского класса данных.

в любом случае я надеюсь, что вы пересмотрите свой выбор ListView, так как он потребляет много оперативной памяти (памяти) во время выполнения, и вместо этого используйте RecyclerView