Ошибка Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
Не создаётся view для диалога. Один и тот же метод addAndEditSchedule вызывается в двух местах. По нажатию на fab во фрагменте и из Aдаптера при нажатие на элемент списка Recycler View. После нажатия fab всё отрабатывает корректно, а после нажатия на view списка выпадает ошибка:
FATAL EXCEPTION: main
Process: com.example.singupactivity, PID: 5970
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
at android.view.LayoutInflater.from(LayoutInflater.java:229)
at com.example.singupactivity.ui.main.Fragment.DailyScheduleFragment.addAndEditCars(DailyScheduleFragment.kt:100)
at com.example.singupactivity.ui.main.Adapter.DailyScheduleAdapter.onBindViewHolder$lambda-0(DailyScheduleAdapter.kt:51)
at com.example.singupactivity.ui.main.Adapter.DailyScheduleAdapter.$r8$lambda$_ecFXy4TdRjp8oVBxwFPnZaehRU(Unknown Source:0)
at com.example.singupactivity.ui.main.Adapter.DailyScheduleAdapter$$ExternalSyntheticLambda0.onClick(Unknown Source:4)
at android.view.View.performClick(View.java:6897)
at android.view.View$PerformClick.run(View.java:26104)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Код Fragment:
class DailyScheduleFragment : Fragment() {
lateinit var adapter: DailyScheduleAdapter
lateinit var dailyScheduleDataClass: DailyScheduleDataClass
lateinit var campDbManager: CampDbManager
var dailyScheduleList = ArrayList<DailyScheduleDataClass>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
campDbManager = activity?.let { CampDbManager(it) }!!
adapter = DailyScheduleAdapter()
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val view: View = inflater.inflate(R.layout.fragment_daily_schedule, container, false)
val rv = view.findViewById<RecyclerView>(R.id.rcDailySchedule)
val fabDailySchedule = view.findViewById<FloatingActionButton>(R.id.fabDailySchedule)
rv.layoutManager = GridLayoutManager(activity, 3)
rv.itemAnimator = DefaultItemAnimator()
val eventTimeList = campDbManager.selectToTableDailySchedule(COLUMN_NAME_TIME_EVENT)
val eventNameList = campDbManager.selectToTableDailySchedule(COLUMN_NAME_NAME_EVENT)
val eventDateList = campDbManager.selectToTableDailySchedule(COLUMN_NAME_DATE_EVENT)
for ((i, elm) in eventTimeList.withIndex()) {
adapter.addDailySchedule(
DailyScheduleDataClass(
eventTimeList[i],
eventNameList[i], eventDateList[i]
)
)
}
fabDailySchedule.setOnClickListener {
addAndEditSchedule(false, null, -1)
}
rv.adapter = adapter
return view
}
@SuppressLint("InflateParams")
fun addAndEditSchedule(
isUpdate: Boolean,
dailyScheduleDataClass: DailyScheduleDataClass?,
position: Int
) {
val view = LayoutInflater.from(context).inflate(R.layout.add_daily_schedule, null)
val alertDialogBuilderUserInput: AlertDialog.Builder =
AlertDialog.Builder(requireActivity())
alertDialogBuilderUserInput.setView(view)
var newDayTitle = view.findViewById<TextView>(R.id.newDayTitle)
val etName = view.findViewById<EditText>(R.id.etName)
val etData = view.findViewById<EditText>(R.id.etData)
val etTime = view.findViewById<EditText>(R.id.etTime)
newDayTitle.text = if (!isUpdate) "Добавить" else "Редактировать"
if (isUpdate && dailyScheduleDataClass != null) {
etName.setText(dailyScheduleDataClass.nameEvent)
etData.setText(dailyScheduleDataClass.dateEvent)
etTime.setText(dailyScheduleDataClass.timeEvent)
}
alertDialogBuilderUserInput
.setCancelable(false)
.setPositiveButton(if (isUpdate) "Обновить" else "Сохранить",
DialogInterface.OnClickListener { dialogBox, id -> })
.setNegativeButton(if (isUpdate) "Удалить" else "Закрыть",
DialogInterface.OnClickListener { dialogBox, id ->
if (isUpdate) {
deleteDailySchedule(position)
} else {
dialogBox.cancel()
}
})
val alertDialog: AlertDialog = alertDialogBuilderUserInput.create()
alertDialog.show()
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(View.OnClickListener {
if (TextUtils.isEmpty(etName.text.toString())) {
Toast.makeText(requireActivity(), R.string.enter_name_event, Toast.LENGTH_SHORT)
.show()
return@OnClickListener
} else if (TextUtils.isEmpty(etData.text.toString())) {
Toast.makeText(requireActivity(), R.string.enter_data_event, Toast.LENGTH_SHORT)
.show()
return@OnClickListener
} else if (TextUtils.isEmpty(etTime.text.toString())) {
Toast.makeText(requireActivity(), R.string.enter_time_event, Toast.LENGTH_SHORT)
.show()
return@OnClickListener
} else {
alertDialog.dismiss()
}
if (isUpdate && dailyScheduleDataClass != null) {
updateDailySchedule(
nameEventUpdate = etName.text.toString(),
dateEventUpdate = etData.text.toString(),
timeEventUpdate = etTime.text.toString(),
position = position
)
} else {
createDailySchedule(
nameEventCreate = etName.text.toString(),
dateEventCreate = etData.text.toString(),
timeEventCreate = etTime.text.toString()
)
}
})
}
private fun deleteDailySchedule(position: Int) {
dailyScheduleList.removeAt(position)
campDbManager.deleteRawToTableDailySchedule(position)
}
private fun updateDailySchedule(
timeEventUpdate: String, nameEventUpdate: String,
dateEventUpdate: String, position: Int
) {
dailyScheduleDataClass = dailyScheduleList[position]
dailyScheduleDataClass.timeEvent = timeEventUpdate
dailyScheduleDataClass.dateEvent = dateEventUpdate
dailyScheduleDataClass.nameEvent = nameEventUpdate
dailyScheduleList[position] = dailyScheduleDataClass
campDbManager.updateRawToTableDailySchedule(
nameEvent = nameEventUpdate,
dateEvent = dateEventUpdate,
timeEvent = timeEventUpdate,
position = position
)
}
private fun createDailySchedule(
timeEventCreate: String, nameEventCreate: String,
dateEventCreate: String
) {
val dailyScheduleDataClassCreate = DailyScheduleDataClass(
timeEvent = timeEventCreate,
nameEvent = nameEventCreate,
dateEvent = dateEventCreate
)
dailyScheduleList.add(dailyScheduleDataClassCreate)
for ((i, elm) in dailyScheduleList.withIndex()) {
adapter.addDailySchedule(dailyScheduleList[i])
}
campDbManager.insertToTableDailySchedule(
nameEvent = nameEventCreate,
dateEvent = dateEventCreate,
timeEvent = timeEventCreate
)
}
}
Код Адаптера:
class DailyScheduleAdapter : RecyclerView.Adapter<DailyScheduleAdapter.DailyScheduleHolder>() {
val dailyScheduleList = ArrayList<DailyScheduleDataClass>()
class DailyScheduleHolder(item : View) : RecyclerView.ViewHolder(item) {
private val binding = DailySceduleListItemBinding.bind(item)
fun bind(dailyScheduleDataClass: DailyScheduleDataClass) = with(binding){
tvNameEvent.text = dailyScheduleDataClass.nameEvent
tvData.text = dailyScheduleDataClass.dateEvent
tvTime.text = dailyScheduleDataClass.timeEvent
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DailyScheduleHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.daily_scedule_list_item, parent, false)
return DailyScheduleHolder(view)
}
override fun onBindViewHolder(holder: DailyScheduleHolder, position: Int) {
holder.bind(dailyScheduleList[position])
val dailyScheduleDataClass: DailyScheduleDataClass = dailyScheduleList[position]
holder.itemView.setOnClickListener{
DailyScheduleFragment().addAndEditSchedule(true, dailyScheduleDataClass, position)
}
}
override fun getItemCount(): Int {
return dailyScheduleList.size
}
@SuppressLint("NotifyDataSetChanged")
fun addDailySchedule(dailyScheduleDataClass: DailyScheduleDataClass) {
dailyScheduleList.add(dailyScheduleDataClass)
notifyDataSetChanged()
}
}