GridLayout in Kotlin?

12,416

Solution 1

Use a GridLayoutManager instead.

Replace:

recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)

With:

recyclerView.layoutManager = GridLayoutManager(context, 2)

Solution 2

Replace your recyclerview.layoutManager from LinearLayoutManager to a GridLayoutManger GridLayoutManager doc

Share:
12,416
arcade16
Author by

arcade16

Mobile and full stack web developer with 5 years of experience designing, developing, and launching mobile applications for both Android and iOS. Experienced in comprehensive application and website development, including graphic design, database design and implementation, full stack development, etc. Fledgling security / Python engineer.

Updated on July 02, 2022

Comments

  • arcade16
    arcade16 almost 2 years

    I am trying to get a 2x6 (WxH) GridLayout in my Kotlin Android application. I have my xml and fragment / adapter set up for a RecyclerView but am a bit at a loss for as how to apply a GridLayout to this.

    How can I get my items (listview_row_enrollments.xml) to show in a grid instead of just a horizontal list?

    EnrollmentFragment.kt

    class EnrollmentsFragment : Fragment() {
    
        // TODO: Rename and change types of parameters
        private var mParam1: String? = null
        private var mParam2: String? = null
    
        private var mListener: OnFragmentInteractionListener? = null
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            if (arguments != null) {
                mParam1 = arguments.getString(ARG_PARAM1)
                mParam2 = arguments.getString(ARG_PARAM2)
            }
        }
    
        override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                                  savedInstanceState: Bundle?): View? {
            // Inflate the layout for this fragment
            var view = inflater!!.inflate(R.layout.fragment_enrollments, container, false)
            loadView(view)
            return view
        }
    
        fun loadView(view: View) {
            var recyclerView: RecyclerView = view.findViewById<RecyclerView>(R.id.recyclerView) as RecyclerView
            recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
            recyclerView.setHasFixedSize(true)
            recyclerView.adapter = EnrollmentsAdapter()
        }
    
    //    override fun onAttach(context: Context?) {
    //        super.onAttach(context)
    //        if (context is OnFragmentInteractionListener) {
    //            mListener = context
    //        } else {
    //            throw RuntimeException(context!!.toString() + " must implement OnFragmentInteractionListener")
    //        }
    //    }
    
        override fun onDetach() {
            super.onDetach()
            mListener = null
        }
    
        interface OnFragmentInteractionListener {
            // TODO: Update argument type and name
            fun onFragmentInteraction(uri: Uri)
        }
    
        companion object {
    
            private val ARG_PARAM1 = "param1"
            private val ARG_PARAM2 = "param2"
    
            fun newInstance(): EnrollmentsFragment {
                val fragment = EnrollmentsFragment()
                val args = Bundle()
                fragment.arguments = args
                return fragment
            }
        }
    }// Required empty public constructor
    

    EnrollmentsAdapter.kt:

    class EnrollmentsAdapter : RecyclerView.Adapter<EnrollmentsAdapter.EnrollmentsViewHolder>() {
        private val items: List<String>
    
        init {
            this.items = Arrays.asList("Breaches", "Data Leaks", "Hacker Chatter", "Services Monitored", "xxx", "xxx")
        }
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EnrollmentsViewHolder {
            val view = LayoutInflater.from(parent.context).inflate(R.layout.listview_row_enrollments, parent, false)
    
    //        view.titleTextView.typeface = Typeface.createFromAsset(view.context.assets, "fonts/Montserrat-Regular.ttf")
    //        view.countTextView.typeface = Typeface.createFromAsset(view.context.assets, "fonts/Montserrat-Regular.ttf")
    //        view.subtextTextView.typeface = Typeface.createFromAsset(view.context.assets, "fonts/Montserrat-Regular.ttf")
    //        view.updatedTextView.typeface = Typeface.createFromAsset(view.context.assets, "fonts/Montserrat-Light.ttf")
    
            return EnrollmentsViewHolder(view)
        }
    
        override fun onBindViewHolder(holder: EnrollmentsViewHolder, position: Int) {
            holder.bind(getItem(position))
        }
    
        override fun getItemCount(): Int {
            return 6
        }
    
        fun getItem(position: Int): String {
            return items[position]
        }
    
        class EnrollmentsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    
            fun bind(value: String) {
    //            itemView.titleTextView.text = value
            }
    
        }
    
    }
    

    FragmentEnrollments.xml:

    <RelativeLayout 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"
        tools:context="xxx.xxx.EnrollmentsFragment">
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:background="@color/kLightGray"
            android:paddingTop="8dp"
            android:clipToPadding="false"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    </RelativeLayout>
    

    listview_row_enrollments.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:padding="5dp"
        android:layout_width="150dp"
        android:layout_height="150dp">
    
        <TextView
            android:id="@+id/info_text"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:background="@color/colorAccent"/>
    
    </LinearLayout>
    

    What my view looks like now: enter image description here