Удалить строку из RecyclerView - PullRequest
0 голосов
/ 02 июня 2019

У меня есть фрагмент реселлера во фрагменте, и я применил в нем пролистывание.

Пожалуйста, найдите код ниже:

fragment.kt

private lateinit var mBinding: FragmentToDoBinding
private lateinit var mToDoViewModel: ToDoViewModel

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

    // Inflate the layout for this fragment
    mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_to_do, container, false)

    configureScreenAppearance()

    val application = requireNotNull(this.activity).application

    val dataSource = LifestyleDatabase.getInstance(application).toDoDao

    val viewModelFactory = ToDoViewModelFactory(dataSource, application)

    mToDoViewModel = ViewModelProviders.of(this, viewModelFactory).get(ToDoViewModel::class.java)

    mBinding.lifecycleOwner = this

    val adapter = ToDoAdapter()
    mBinding.RecyclerViewFromFragmentToDoMain.adapter = adapter

    mToDoViewModel.toDos.observe(viewLifecycleOwner, Observer {
        it?.let { x ->

            //Update the UI and determine whether recyclerview should be visible or not
            updateUI(x.isNotEmpty())

            adapter.submitList(x)
        }
    })

    val swipeHandler = object : SwipeToCallback(requireContext()) {
        override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
            //Delete the item
        }
    }

    val itemTouchHelper = ItemTouchHelper(swipeHandler)
    itemTouchHelper.attachToRecyclerView(mBinding.RecyclerViewFromFragmentToDoMain)

    return mBinding.root
}

ToDoAdapter.kt

class ToDoAdapter : ListAdapter<ToDo, ToDoAdapter.ViewHolder>(ToDoDiffCallback()) {
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val toDo = getItem(position)
    holder.bind(toDo)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    return ViewHolder.from(parent)
}
class ViewHolder private constructor(val binding: CustomRecyclerviewListTodoBinding): RecyclerView.ViewHolder(binding.root){
    fun bind(toDo: ToDo) {
        binding.myToDo = toDo
        binding.executePendingBindings()
    }
    companion object {
        fun from(parent: ViewGroup): ViewHolder {
            val layoutInflater = LayoutInflater.from(parent.context)
            val binding = CustomRecyclerviewListTodoBinding.inflate(layoutInflater, parent, false)
            return ViewHolder(binding)
        }
    }
}
}

class ToDoDiffCallback: DiffUtil.ItemCallback<ToDo>(){
    override fun areItemsTheSame(oldItem: ToDo, newItem: ToDo): Boolean {
        return oldItem.id == newItem.id
    }
    override fun areContentsTheSame(oldItem: ToDo, newItem: ToDo): Boolean {
        return oldItem == newItem
    }
}

Мне нужно удалить строку, которая была проведена в методе здесь:

val swipeHandler = object : SwipeToCallback(requireContext()) {
    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        //Delete the item
    }
}

Но я не могу найти способ сделать это. Может кто-нибудь помочь с рабочим кодом, пожалуйста?

Я пытался найти некоторые методы для удаления элемента в адаптере, но я не могу найти ни одного.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 03 июня 2019

Вы можете использовать ItemTouchHelper.SimpleCallBack

ItemTouchHelper mIth = new ItemTouchHelper(
          new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN,
              ItemTouchHelper.LEFT) {
              public boolean onMove(RecyclerView recyclerView,
                  ViewHolder viewHolder, ViewHolder target) {

              }
              public void onSwiped(ViewHolder viewHolder, int direction) {
                  // remove from adapter
              }
      });

И тогда только вы напишите что-то вроде этого.

new ItemTouchHelper(mIth).attachToRecyclerView(mRecyclerView);
...