Проблема с обновлением моего Recycler View новыми элементами - PullRequest
0 голосов
/ 16 июня 2020

Итак, моя основная проблема на данный момент - это попытка добавить данные в мой вид ресайклера. По сути, я создал кнопку, которая добавляет строку "hello" в список, а затем пытается вызвать mAdapter.notifyItemInserted(dataSet.size). Он отлично добавляется в конец списка в журналах, но я просто не могу понять, как обновить для него пользовательский интерфейс.

Единственные элементы, которые мне удалось загрузить на данный момент, - это элементы fakeItems которые создаются при запуске приложения.

class MainActivity : AppCompatActivity() {

var dataSet = mutableListOf<String>()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    insertFakeItems()
    setUpRecycler()

}

private fun insertFakeItems() {

    for (i in 0..5) {
        dataSet.add("Item #$i")
    }

}

private fun setUpRecycler() {

    val mAdapter = MyAdapter(dataSet)
    val mList = list
    mList.layoutManager = LinearLayoutManager(this)
    mList.adapter = mAdapter

    mList.orientation =
        DragDropSwipeRecyclerView.ListOrientation.VERTICAL_LIST_WITH_VERTICAL_DRAGGING
    //mList.disableSwipeDirection(DragDropSwipeRecyclerView.ListOrientation.DirectionFlag.RIGHT)

    // button

    val onItemSwipeListener = object : OnItemSwipeListener<String> {
        override fun onItemSwiped(
            position: Int,
            direction: OnItemSwipeListener.SwipeDirection,
            item: String
        ): Boolean {
            Log.d("Main", "Position = $position, Direction = $direction, Item = $item")

            when (direction) {
                OnItemSwipeListener.SwipeDirection.RIGHT_TO_LEFT -> {
                    Toast.makeText(applicationContext, "Item ${position+1} deleted", Toast.LENGTH_SHORT).show()
                    //todo: add deleted code here
                }
                OnItemSwipeListener.SwipeDirection.LEFT_TO_RIGHT -> {
                    Toast.makeText(applicationContext, "Item ${position+1} archived", Toast.LENGTH_SHORT).show()
                    //todo: add archived code here
                }
            }
            return false
        }
    }
    mList.swipeListener = onItemSwipeListener

    fab_add.setOnClickListener {
        Log.d("Main", "Button pressed")

        dataSet.add(dataSet.size,"hello")
        mAdapter.notifyItemInserted(dataSet.size)
        println(dataSet)
    }
}

}

А это адаптер:

class MyAdapter(dataSet: MutableList<String>)
: DragDropSwipeAdapter<String, MyAdapter.ViewHolder>(dataSet) {

class ViewHolder(itemView: View) : DragDropSwipeAdapter.ViewHolder(itemView) {
    val itemText: TextView = itemView.findViewById(R.id.item_text)
    val dragIcon: ImageView = itemView.findViewById(R.id.drag_icon)
}

override fun getViewHolder(itemLayout: View) = MyAdapter.ViewHolder(itemLayout)

override fun onBindViewHolder(item: String, viewHolder: MyAdapter.ViewHolder, position: Int) {

    viewHolder.itemText.text = item
}

override fun getViewToTouchToStartDraggingItem(item: String, viewHolder: MyAdapter.ViewHolder, position: Int): View? {

    return viewHolder.dragIcon
}

override fun onDragFinished(item: String, viewHolder: ViewHolder) {
    super.onDragFinished(item, viewHolder)
    println("$dataSet")
}

}

Ответы [ 2 ]

1 голос
/ 16 июня 2020

Проблема в том, что в Java или Kotlin вы передаете по значению, а не по ссылке. Итак, пока вы не измените значение набора данных, который вы используете в RecyclerView, вы не получите никакого эффекта.

Сделайте что-то вроде этого (:


class MyAdapter(dataSet: MutableList<String>)
: DragDropSwipeAdapter<String, MyAdapter.ViewHolder>(dataSet) {

    private var dataSet: MutableList<String>

    init {
        this.dataSet = dataSet
    }

    class ViewHolder(itemView: View) : DragDropSwipeAdapter.ViewHolder(itemView) {
        val itemText: TextView = itemView.findViewById(R.id.item_text)
        val dragIcon: ImageView = itemView.findViewById(R.id.drag_icon)
    }

    override fun getViewHolder(itemLayout: View) = MyAdapter.ViewHolder(itemLayout)

    override fun onBindViewHolder(item: String, viewHolder: MyAdapter.ViewHolder, position: Int) {

        viewHolder.itemText.text = item
    }

    override fun getViewToTouchToStartDraggingItem(item: String, viewHolder: MyAdapter.ViewHolder, position: Int): View? {

        return viewHolder.dragIcon
    }

    override fun onDragFinished(item: String, viewHolder: ViewHolder) {
        super.onDragFinished(item, viewHolder)
        println("$dataSet")
    }

    fun updateItem(item: String) {
        this.dataSet.add(item)
        notifyItemInserted(dataSet.size - 1)
    }

}

In activity:

fab_add.setOnClickListener {
        Log.d("Main", "Button pressed")

mAdapter.updateItem("hello")
        println(dataSet)
    }
0 голосов
/ 16 июня 2020

После изменения списка элементов recycleView необходимо вызвать notifyDatasetChanged.

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