I am currently creating a custom Dialog to show hours from 00:00 to 23:59, I am using kotlin as language of development. My problem is that when I open the dialog there is an error on the recycler view. This is my code
Calendar Dialog Class
class CalendarDialog : DialogFragment() {
/**
* Define variables
*/
private val mDaysList : MutableList<Days> = ArrayList()
private val dayMonthYear = "2018-06-14" //TODO fetch the date of today
/**
* Initialize the adapter
*/
private val adapter = CalendarAdapter(mDaysList)
/**
* Initialize the layout manager
*/
private fun getLinearLayoutManager(): LinearLayoutManager {
return LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false)
}
private fun initView() {
setDataListItems()
recyclerViewCalendar?.adapter = adapter
recyclerViewCalendar?.layoutManager = getLinearLayoutManager()
recyclerViewCalendar?.setHasFixedSize(true)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val rootView = inflater.inflate(R.layout.calendar_dialog, container)
initView()
return rootView
}
/**
* TODO dependendo do horário da clinica bloqueio e desbloqueio horários
*/
private fun setDataListItems() {
mDaysList.add(Days("06:00", dayMonthYear))
mDaysList.add(Days("06:30", dayMonthYear))
mDaysList.add(Days("07:00", dayMonthYear))
mDaysList.add(Days("07:30", dayMonthYear))
mDaysList.add(Days("08:00", dayMonthYear))
mDaysList.add(Days("08:30", dayMonthYear))
mDaysList.add(Days("09:00", dayMonthYear))
mDaysList.add(Days("09:30", dayMonthYear))
mDaysList.add(Days("10:00", dayMonthYear))
mDaysList.add(Days("10:30", dayMonthYear))
mDaysList.add(Days("11:00", dayMonthYear))
mDaysList.add(Days("11:30", dayMonthYear))
mDaysList.add(Days("12:00", dayMonthYear))
mDaysList.add(Days("12:30", dayMonthYear))
mDaysList.add(Days("13:00", dayMonthYear))
mDaysList.add(Days("13:30", dayMonthYear))
mDaysList.add(Days("14:00", dayMonthYear))
mDaysList.add(Days("14:30", dayMonthYear))
mDaysList.add(Days("15:00", dayMonthYear))
mDaysList.add(Days("15:30", dayMonthYear))
mDaysList.add(Days("16:00", dayMonthYear))
mDaysList.add(Days("16:30", dayMonthYear))
mDaysList.add(Days("17:00", dayMonthYear))
mDaysList.add(Days("17:30", dayMonthYear))
mDaysList.add(Days("18:00", dayMonthYear))
mDaysList.add(Days("18:30", dayMonthYear))
mDaysList.add(Days("19:00", dayMonthYear))
mDaysList.add(Days("19:30", dayMonthYear))
mDaysList.add(Days("20:00", dayMonthYear))
mDaysList.add(Days("20:30", dayMonthYear))
}
}
Item.xml
<android.support.constraint.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"
android:paddingLeft="16dp"
android:paddingRight="16dp">
<android.support.design.widget.TextInputLayout
android:id="@+id/client_id_input_layout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@+id/guideline"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent">
<TextView
android:id="@+id/hourOfDay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="monospace"
android:gravity="center"
android:text="00:00"
android:textColor="@color/picker_default_selected_text_color"
android:textSize="36sp"
android:textStyle="bold" />
</android.support.design.widget.TextInputLayout>
<android.support.constraint.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/guideline"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5"/>
<TextView
android:id="@+id/day_month_year"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:text="22 Agosto 2018"
android:textStyle="bold|italic"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline" />
</android.support.constraint.ConstraintLayout>
Model class
data class Days(var hourOfDay:String ,var dayMonthYear:String)
Calendar dialog layout xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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="wrap_content"
android:background="#f4f2f2"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerViewCalendar"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</android.support.constraint.ConstraintLayout>
Fragment class ( Where I call the dialog)
class BlockSchedulesFragment : BaseFragment<BlockSchedulesViewModel>() {
/**
* Call this fragment in the parent activity
*/
companion object {
fun newInstance() = BlockSchedulesFragment()
}
/**
* Base fragment methods
*/
override fun layoutToInflate() = R.layout.fragment_block_shedules_screen
override fun definedViewModel() = ViewModelProviders.of(this, Injection.provideViewModelBlockerFactory(context))
.get(BlockSchedulesViewModel::class.java)
override fun doOnCreated(savedInstanceState: Bundle?) {
//I do the call to the dialog here
val fm = fragmentManager
val tv = CalendarDialog()
open_calendar_btn.setOnClickListener {
tv.show(fm,"TV_tag")
}
confirm_block.setOnClickListener {
Toast.makeText(activity,"Bloqueio efectuado",Toast.LENGTH_SHORT).show()
}
}
}
You are calling initView
method (which access to your RecyclerView) before the view is created. Try calling it in your onViewCreated
method, which is called after the view is created. Your RecyclerView shouldn't be null by then.