问题
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:
回答1:
Use a GridLayoutManager instead.
Replace:
recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
With:
recyclerView.layoutManager = GridLayoutManager(context, 2)
回答2:
Replace your recyclerview.layoutManager
from LinearLayoutManager
to a GridLayoutManger
GridLayoutManager doc
来源:https://stackoverflow.com/questions/45927061/gridlayout-in-kotlin