Recycler view не обновляется должным образом - PullRequest
0 голосов
/ 26 августа 2018

Я задавал подобные вопросы несколько раз, и вот уже более 2 недель я пытаюсь найти решение для этого.Да, я знаю, что есть несколько похожих вопросов, но причина, по которой я спрашиваю, состоит в том, что ни одно из решений, основанных на стеке, не работает. Я новичок в разработке под Android, поэтому прошу вас любезнопомогите мне с этой проблемой.Я почти разочаровался в своем проекте.

Как работает приложение

Приложение выполняет два действия.Основное действие используется для отображения данных в виде представлений карт с использованием представления переработчика, загруженного из SQ Lite DB .Пользователь может щелкнуть карточку, которая при щелчке запускает новую активность (ССЫЛКА).Данные по нажатой карточке загружаются во второй активности.Здесь пользователь может выполнять ОБНОВЛЕНИЕ или УДАЛЕНИЕ .

ПРОБЛЕМА

Проблема в том, что мне нужно перезапустить приложение, чтобы увидеть изменения в заметке.Например, если я создаю заметку во втором занятии и возвращаюсь к основному занятию, эта заметка CREATED будет НЕ видимой до перезапуска приложения.То же самое касается, когда заметка обновляется или удаляется.Изменение происходит только при перезапуске приложения.

То, что я пробовал до сих пор ...

  • с именем notifyDataSetChanged () в onRestart () изОСНОВНОЕ действие.

  • Извлекает всю нагрузку, которая загружает элементы просмотра переработчика, на первое место в onRestart ()

  • Попытка обновления адаптера с новыми данными

----- КОДЫ -----

ОСНОВНАЯ ДЕЯТЕЛЬНОСТЬ

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

    }
}

СПРАВОЧНАЯ ДЕЯТЕЛЬНОСТЬ

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

АДАПТЕР

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
}

Да, Я знаю, что трудно кому-то пройтикод.Я пытался исправить это много раз, сидя целый день, пытаясь понять это, и все еще не повезло.Я прошу вас, пожалуйста, помогите мне с этим.Мне все равно, если вы делаете в Java, мне просто нужен способ это исправить.

1 Ответ

0 голосов
/ 26 августа 2018

Объявите свою MainActivity в AndroidManifest.xml файле следующим образом.

android:launchMode="singleTask"

Перед завершением 'ReferenceActivity' (т. Е. Вызовом finish ()), сделайте намеренный вызов вашей 'MainActivity'.Кроме того, переопределите метод «onNewIntent ()» внутри метода «MainActivity».

@Override
protected void onNewIntent(Intent intent)

Внутри метода «onNewIntent ()» загрузите данные снова, как вы уже это делаете в «onStart ()» и «onRestart ()».

Пояснение, что мы делаем, это добавляем одну ссылку нашей 'MainActivity' в стек активности, поэтому всякий раз, когда делается намеренный вызов 'MainActivity' вместо создания множественной ссылки, он просто создает одну ссылку и вызываетnewIntentMethod каждый раз.

Надеюсь, это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...