I have asked this similar questions multiple times and its been more than 2 weeks that I am trying to figure out a solution for it. Yes, I am aware that there are multiple similar question but the reason why I am asking is because none of the solutions from stack over flow work.I am a beginner in Android development, hence I ask you to kindly help me with this problem. I have almost given up on my project.
How app works
App has two activities. Main activity is used for showing data in form of card views using recycler view which is loaded from SQ Lite DB. User can click on a card which on clicking will launch a new activity(REFERENCE ACTIVITY). Data of clicked card is loaded in second activity. Here user can perform UPDATE or DELETE function.
PROBLEM
The problem is that I have to restart my app just to see a change in a note. For example, if I create a note in second activity and return to main activity, that CREATED note is NOT visible until app is restarted. Same goes for when a note is updated or deleted. Change only occurs when app is restarted.
What I have tried so far...
called notifyDataSetChanged() in onRestart() of MAIN activity.
Recalled whole load that loads recycler view items in first place in onRestart()
Tried updating adapter with the new data
----- CODES -----
MAIN ACTIVITY
class MainActivity : AppCompatActivity() {
var dbHandler: PediaDatabase = PediaDatabase(this)
var adapter: PediaAdapter? = null
var newAdapter: PediaAdapter? = null
var layoutManager: RecyclerView.LayoutManager? = null
var list: ArrayList<UserNotes>? = ArrayList()
var listItems: ArrayList<UserNotes>? = ArrayList()
var updatedList: ArrayList<UserNotes> = ArrayList()
var tempList: ArrayList<UserNotes>? = null
var myPrefs: SharedPreferences? = null
var first_run: Boolean = true
var isCreated: Boolean = false
var isUpdated: Boolean = false
var isDeleted: Boolean = false
var isReturning: Boolean = false
var updatedTitle: String? = null
var updatedText: String? = null
val PREFS_NAME: String = "MYPREFS"
val REQUEST_CODE: Int = 1
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
showOneTimeMessage()
invalidateOptionsMenu()
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
window.navigationBarColor = Color.BLACK
}
}
override fun onRestart() {
super.onRestart()
if(isUpdated)
{
recyclerViewID.recycledViewPool.clear()
var test = listItems!![adapPos]
test.noteTitle = updatedTitle
test.noteText = updatedText
listItems!!.set(adapPos, test)
adapter!!.notifyItemChanged(adapPos)
isUpdated = false
}
}
override fun onStart() {
super.onStart()
if(isReturning)
{
adapter!!.updateResults(this.listItems!!)
adapter!!.notifyDataSetChanged()
}
adapter = PediaAdapter(this, listItems!!)
layoutManager = LinearLayoutManager(this)
recyclerViewID.adapter = adapter
recyclerViewID.layoutManager = layoutManager
list = dbHandler.readAllNotes()
for(reader in list!!.iterator())
{
var note = UserNotes()
note.noteTitle = reader.noteTitle
note.noteText = reader.noteText
note.noteID = reader.noteID
note.noteDate = reader.noteDate
listItems!!.add(note)
}
adapter!!.notifyDataSetChanged()
if(dbHandler.totalNotes() == 0) {
recyclerViewID.visibility = View.GONE
}
else{
recyclerViewID.visibility = View.VISIBLE
showWhenEmptyID.visibility = View.GONE
}
recyclerViewID.hasFixedSize()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(requestCode == REQUEST_CODE)
if(resultCode == Activity.RESULT_OK)
{
//isCreated = data!!.extras!!.getBoolean("isCreated")
updatedTitle = data!!.extras.getString("updatedTitle")
updatedText = data!!.extras.getString("updatedText")
isReturning = data.extras!!.getBoolean("returningBack")
// isUpdated = data.extras!!.getBoolean("isUpdated")
}
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.top_menu, menu)
val item = menu!!.findItem(R.id.delete_note_menu)
item.setVisible(false)
return true
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
if(item!!.itemId == R.id.add_note_menu){
isNewNote = true
startActivity(Intent(this, ReferenceActivity::class.java))
}
if(item!!.itemId == R.id.delete_note_menu)
{
Toast.makeText(this,"DELETED", Toast.LENGTH_SHORT).show()
}
return super.onOptionsItemSelected(item)
}
private fun showOneTimeMessage()
{
var data: SharedPreferences = getSharedPreferences(PREFS_NAME, 0)
if(data.contains("isShown"))
{
first_run = data.getBoolean("isShown", true)
}
Log.d("FIRST_RUN", first_run.toString())
if(first_run)
{
val oneTimeMsg = SweetAlertDialog(this)
oneTimeMsg.setTitleText("Hey there!")
oneTimeMsg.setContentText("Thank you for downloading! Please don`t forget to rate our app :)").show()
oneTimeMsg.setConfirmClickListener(object : SweetAlertDialog.OnSweetClickListener
{
override fun onClick(sweetAlertDialog: SweetAlertDialog?)
{
oneTimeMsg.dismissWithAnimation()
}
}).show()
myPrefs = getSharedPreferences(PREFS_NAME, 0)
var editor: SharedPreferences.Editor = (myPrefs as SharedPreferences).edit()
editor.putBoolean("isShown", false)
editor.commit()
}
}
REFERENCE ACTIVITY
class ReferenceActivity : AppCompatActivity() {
var dbHandler: PediaDatabase? = null
var note = UserNotes()
var noteExisted: Boolean = false
var cardAdapterPos: Int? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_reference)
getSupportActionBar()!!.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM)
getSupportActionBar()!!.setCustomView(R.layout.custom_toolbar)
val dateTxtView = findViewById<View>(resources.getIdentifier("action_bar_title", "id", packageName)) as TextView
overridePendingTransition(R.anim.slide_in, R.anim.slide_out)
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
window.navigationBarColor = Color.BLACK
dbHandler = PediaDatabase(this)
val data = intent
if(isNewNote != true/*isNewNote.extras.getBoolean("isNewNote") != true*/)
{
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)
if(data != null)
{
noteExisted = true
this.cardAdapterPos = data.extras.getInt("cardPosition")
cardID = data.extras.getInt("cardID")
existingNote = dbHandler!!.readNote(cardID)
refTitleID.setText(existingNote.noteTitle, TextView.BufferType.EDITABLE)
refTextID.setText(existingNote.noteText, TextView.BufferType.EDITABLE)
dateTxtView.text = existingNote.noteDate.toString()
}
}else{
dateTxtView.text = "New note"
}
}
override fun onStop() {
super.onStop()
var title: String = refTitleID.text.toString().trim()
var text: String = refTextID.text.toString().trim()
if(existingNote.noteText == text && existingNote.noteTitle == title)
finish()
if(noteExisted)
{
if(TextUtils.isEmpty(title))
title = "No title"
existingNote.noteTitle = title
existingNote.noteText = text
existingNote.noteDate = System.currentTimeMillis().toString() //TODO TRY THIS
dbHandler!!.updateNote(existingNote)
var dataCreate = this.intent
dataCreate.putExtra("isUpdated", true)
dataCreate.putExtra("updatedTitle", title)
dataCreate.putExtra("updatedText",text)
dataCreate.putExtra("returningBack", true)
setResult(Activity.RESULT_OK, dataCreate)
finish()
}
else
{
if(TextUtils.isEmpty(title) && TextUtils.isEmpty(text))
{
finish()
}
else
{
if(TextUtils.isEmpty(title))
title = "No title"
note.noteTitle = title
note.noteText = text
note.noteDate = System.currentTimeMillis().toString()
// note.noteID =
dbHandler!!.createNote(note)
var dataCreate = this.intent
dataCreate.putExtra("isCreated", true)
dataCreate.putExtra("returningBack", true)
setResult(Activity.RESULT_OK, dataCreate)
finish()
}
}
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.top_menu, menu)
val addItem: MenuItem = menu!!.findItem(R.id.add_note_menu)
val delItem:MenuItem = menu.findItem(R.id.delete_note_menu)
addItem.setVisible(false)
delItem.setVisible(false)
if(noteExisted)
delItem.setVisible(true)
return true
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
if(item!!.itemId == R.id.delete_note_menu)
{
val dialogMsg = SweetAlertDialog(this, SweetAlertDialog.WARNING_TYPE)
dialogMsg.setTitleText("Are you sure?")
dialogMsg.setContentText("You won`t be able to recover this note!")
dialogMsg.setConfirmText("Yes, delete it!")
dialogMsg.setConfirmClickListener(object: SweetAlertDialog.OnSweetClickListener {
override fun onClick(sweetAlertDialog: SweetAlertDialog?) {
dialogMsg.dismissWithAnimation()
dbHandler!!.deleteNote(cardID)
val successMsg = SweetAlertDialog(sweetAlertDialog!!.context, SweetAlertDialog.SUCCESS_TYPE)
successMsg.setTitleText("Note deleted!")
successMsg.setContentText("So long,note").show()
successMsg.setCancelable(false)
//TODO Disable 'OK' button on successMsg dialogbox
Handler().postDelayed({
successMsg.dismissWithAnimation()
finish()
}, 1200)
}
}).show()
}
return super.onOptionsItemSelected(item)
}
ADAPTER
class PediaAdapter(private val context: Context,
private var noteslist: ArrayList<UserNotes>): RecyclerView.Adapter<PediaAdapter.ViewHolder>() {
override fun onCreateViewHolder(p0: ViewGroup, p1: Int): ViewHolder
{
val view = LayoutInflater.from(context).inflate(R.layout.list_row,p0,false)
return ViewHolder(view, noteslist)
}
override fun getItemCount(): Int
{
return noteslist.size
}
override fun onBindViewHolder(p0: ViewHolder, p1: Int)
{
p0.bindItems(noteslist[p1])
}
inner class ViewHolder(itemView: View, list: ArrayList<UserNotes>): RecyclerView.ViewHolder(itemView), View.OnClickListener
{
private var noteTitle = itemView.findViewById(R.id.listTitleID) as TextView
private var noteText = itemView.findViewById(R.id.listTextID) as TextView
var mList = list
init
{
itemView.setOnClickListener(this)
}
fun bindItems(note: UserNotes)
{
//var id = note.noteID
noteTitle.text = note.noteTitle
noteText.text = note.noteText
}
override fun onClick(v: View?)
{
var mPosition: Int = adapterPosition //For forwarding position to ref activity
var note = mList[mPosition]
adapPos = adapterPosition
var cardID = Intent(itemView.context, ReferenceActivity::class.java)
cardID.putExtra("cardPosition", mPosition)
cardID.putExtra("cardID", note.noteID) //TODO THIS IS FETCHING NOTE_ID VALUES FROM DB
Toast.makeText(itemView.context, "card id = " + note.noteID, Toast.LENGTH_SHORT).show()
itemView.context.startActivity(cardID)
}
}
fun updateResults(items: ArrayList<UserNotes>)
{
this.noteslist = items
}
Yes, I know its hard to go through someones code. I have tried to fix it many times sitting all day trying to figure it out and still no luck. I am requesting you to please help me with this. I don't care if you do in Java, I just need a way to fix it.