GridLayout in Kotlin?
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
![arcade16](https://i.stack.imgur.com/YsoM9.png?s=256&g=1)
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, 2022Comments
-
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>