簡體   English   中英

如何在onRestart()上重繪RecyclerView的卡片視圖?

[英]How to redraw RecyclerView's card view on onRestart()?

我做了一個做筆記的應用程序,它可以執行基本的筆記動作(CRUD)。 問題是,每當用戶從第二個活動中刪除/創建或更新便箋時,主要活動(持有回收者視圖)都不會反映出任何更改。

僅在重新啟動應用程序,屏幕方向更改以及關閉和再次打開手機屏幕時反映更改。 我已經嘗試了stackoverflow的所有其他解決方案,但沒有任何效果。 我仍然必須重新啟動應用程序才能看到更改。 我還不了解任何實時數據,RxJava或任何其他高級體系結構,因為我仍然是初學者

問題是,從第二次活動返回后,如何在回收者視圖中重置名片視圖?

主要活動

class MainActivity : AppCompatActivity() {

var dbHandler: PediaDatabase? = null
var adapter: PediaAdapter? = null
var layoutManager: RecyclerView.LayoutManager? = null
var list: ArrayList<UserNotes>? = ArrayList()
var listItems: ArrayList<UserNotes>? = ArrayList()
var myPrefs: SharedPreferences? = null
var first_run: Boolean = true
var isCreated: Boolean = false
var isUpdated: Boolean = false
var isDeleted: Boolean = false

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 onResume() {
    super.onResume()



    if(adapter != null)
    {
        recyclerViewID.recycledViewPool.clear()
        recyclerViewID.invalidate()
    }


    Toast.makeText(this, "ONSTART", Toast.LENGTH_SHORT).show()
    dbHandler = PediaDatabase(this)
    adapter = PediaAdapter(this, listItems!!)
    layoutManager = LinearLayoutManager(this)

    recyclerViewID.adapter = adapter
    recyclerViewID.layoutManager = layoutManager


    list = dbHandler!!.readAllNotes()
    //listItems = ArrayList()

    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 onRestart() {
    super.onRestart()


    list!!.clear()

    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(isCreated)
    {
        val newIndex: Int = listItems!!.size + 1
        listItems!!.add(newIndex,existingNote)
        adapter!!.notifyItemInserted(newIndex)

    }
}


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")
        }
}


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()

    }
}

適配器類

class PediaAdapter(private val context: Context,
               private val 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)
    }

}

參考活動(第二)

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 sharedPrefs = getSharedPreferences(PREFS_SHARE, Context.MODE_PRIVATE)
        val share_editor: SharedPreferences.Editor = (sharedPrefs as SharedPreferences).edit()
        share_editor.putBoolean("update", true).commit()


        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)

            val dataCreate = this.intent
            dataCreate.putExtra("isCreated", 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.notifyDataSetChanged();

為了告訴RV的適配器重新創建所有viewHolders並重新綁定視圖。

但是,如果您知道已刪除/更新的項目的確切索引,那將是更好的選擇。 這樣,您可以致電:

adapter.notifyItemRemoved(position)

告知適配器刪除物品,或:

adapter.notifyItemChanged(position)

為了告訴適配器重新繪制(調用onBindViewHolder)特定項。

編輯:我看到您已經在調用這些方法,但是您永遠不會更新適配器持有的列表! 您正在活動中而不是適配器中更新列表。 因此,您應該做的是向適配器添加如下所示的方法:

fun updateResults(items: List<UserNotes>) {
    noteslist = items
}

並將“ noteslist” val更改為var。 用新列表調用“ updateResults”后,調用

adapter.notifyDataSetChanged();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM