How to create RecyclerView in Naviagtion Drawer "Fragment"

Viewed 342

I am practicing navigation drawer, I created an Android Studio Navigation Drawer Activity..

And in the gallery fragment I want to create a recyclerView, but I don't know where to start, cause this is different from what I see on tutorials (i.e recyclerView in MainActivity) and this Navigation Drawer Activity files are a lot different and modern.

I don't know if I should follow a tutorial on creating recyclerView on fragment and delete the GalleryViewModel file, cause I dont't know what I'll put inside. And even then, I don't know what exactly I put in the Navigation (mobile_navigation)

So please I'd be grateful if you could link a tutorial or documentation that talks about this, thanks.. And I feel I'd be asking too much, but I'd deeply be grateful if you could made a sample code on this.

Here's my GalleryFragment.kt:

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import com.example.navigationexample.R
import com.example.navigationexample.databinding.FragmentGalleryBinding

class GalleryFragment : Fragment() {

    private lateinit var galleryViewModel: GalleryViewModel
    private var _binding: FragmentGalleryBinding? = null

    // This property is only valid between onCreateView and
    // onDestroyView.
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        galleryViewModel =
            ViewModelProvider(this).get(GalleryViewModel::class.java)

        _binding = FragmentGalleryBinding.inflate(inflater, container, false)
        val root: View = binding.root

        val textView: TextView = binding.textGallery
        galleryViewModel.text.observe(viewLifecycleOwner, Observer {
            textView.text = it
        })
        return root
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

Here's my GalleryViewModel.kt;

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class GalleryViewModel : ViewModel() {

    private val _text = MutableLiveData<String>().apply {
        value = "This is gallery Fragment"
    }
    val text: LiveData<String> = _text
}

Here's my fragment_gallery.xml

<androidx.constraintlayout.widget.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=".ui.gallery.GalleryFragment">

    // I will remove this textView
    <TextView
        android:id="@+id/text_gallery"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:textAlignment="center"
        android:textSize="20sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

And here's my mobile_navigation.xml (from Navigation folder) ;

<navigation 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:id="@+id/mobile_navigation"
    app:startDestination="@+id/nav_home">

    <fragment
        android:id="@+id/nav_home"
        android:name="com.example.navigationexample.ui.home.HomeFragment"
        android:label="@string/menu_home"
        tools:layout="@layout/fragment_home" />

    <fragment
        android:id="@+id/nav_gallery"
        android:name="com.example.navigationexample.ui.gallery.GalleryFragment"
        android:label="@string/menu_gallery"
        tools:layout="@layout/fragment_gallery" />

    <fragment
        android:id="@+id/nav_slideshow"
        android:name="com.example.navigationexample.ui.slideshow.SlideshowFragment"
        android:label="@string/menu_slideshow"
        tools:layout="@layout/fragment_slideshow" />
</navigation>

Thanks a lot for your help, if you need any more information I'd be more happy to provide it. Thanks again..

1 Answers

This is java but should be similar in kotlin. Assuming you already have an adapter.

Fragment

public class HomeFragment extends Fragment {

public HomeFragmentAdapter adapter;

//omitted other variables/functions for clarity

@Override
public View onCreateView(@NonNull LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) {

View root = inflater.inflate(R.layout.shared_recycler_view, container, false);

//omitted other object init for clarity

RecyclerView recyclerView = root.findViewById(R.id.recyclerview);
adapter = new HomeFragmentAdapter(this);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

 return root;
}

....

RecyclerView Adapter

public class HomeFragmentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{  

//this should auto populate with required functions
//onCreateViewHolder
//onBindViewHolder
//getItemCount()
//getItemViewType



....
Related