نوشته شده توسط
mehdi.safavie
درود;
امیر رضا جان، اول باید کد آداپتر اللخصوص کدی که روی آیتم میزنی رو بفرستی تا ببینیم چکار کردی.
چون چیزی که بهش نیاز داری انقدر ها که براش توضیح دادی پیچیده نیست.
اما، یه راهنمایی ساده میگم، اگر جواب نداد باید مارو با کد روشن کنی چه کردی، و چه اتفاقی افتاده، و نیاز داری چه انجام بدی.
زمانی که Fragment رو Load میکنی تو OnCreateView همونطور که گفتی ، متغییر
parentId رو 0 کن. اما بعد از این که هر آیتمی رو Touch کردی، نباید به هیچ وجه رویداد OnCreateView اتفاق بیافته، اگر داره اینطور میشه داری اشتباه میری، تنها باید لیست و آداپتر فیلتر بشه یه لیستی جدید.
حالا این که لیست رو چطور جدید میکنی هم، اول آیدی اون آیتمی که روش Touch کردی رو باید بگیری تحت عنوان parentId جستجو بزنی و لیست Child ها رو بگیری. در نهایت لیستی که بدست اومده رو بدی به آداپتر و NotifyChange بزنی به آداپترت.
اینطوری فقط داری لیست رو Refresh میکنی با محتویات جدید. حالا این که OnCreateView داره دوباره اتفاق میافته، یک جای کار شما به جای Refresh کردن لیست، داری Fragment رو دستکاری میکنی.
اگر اشتباه متوجه شدم، کد هایی که گفتم رو بفرستین ببینیم چی شده دقیقا.
درود جناب صفوی...
ممنون که لطف کردین و این پست رو خوندین و جواب دادین...
واقعا ازتون ممنونم...
این کدهایی هستش که زدم و اگه خیلی مبتدیانه و پر اشتباه هستش پیشاپیش عذر میخوام ...
این کلاس آداپترم هستش:
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.mytodoapp.R
import com.example.mytodoapp.data.db.models.TodoItem
import com.example.mytodoapp.ui.todolist.OnClickRecyclerL istener
import com.example.mytodoapp.ui.todolist.TodoViewModel
import kotlinx.android.synthetic.main.todo_recycler_item. view.*
class TodoRecyclerViewItemAdapter(
var items: List<TodoItem>,
private val viewModel: TodoViewModel
) : RecyclerView.Adapter<TodoRecyclerViewItemAdapter.T odoViewHolder>() {
private lateinit var onClickRecyclerListener: OnClickRecyclerListener
fun setOnClickRecyclerListener(onClickRecyclerListener : OnClickRecyclerListener) {
this.onClickRecyclerListener = onClickRecyclerListener
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TodoViewHolder {
val view = LayoutInflater
.from(parent.context)
.inflate(R.layout.todo_recycler_item, parent, false)
return TodoViewHolder(view)
}
override fun getItemCount(): Int {
return items.size
}
override fun onBindViewHolder(holder: TodoViewHolder, position: Int) {
val todoItem = items[position]
holder.itemView.todoTextView.text = todoItem.todoItem
holder.itemView.setOnClickListener(View.OnClickLis tener {
val parenId = items.get(position)
onClickRecyclerListener.onRecyclerItemClicked(pare nId)
})
holder.itemView.todoItemDeleteImageButton.setOnCli ckListener {
viewModel.delete(todoItem)
}
}
inner class TodoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
}
این هم اینترفیس برای رویداد کلیک ریسایکلر ویو
interface OnClickRecyclerListener {
fun onRecyclerItemClicked(todoItem: TodoItem)
}
اینترفیس مربوط به رویداد کلیک بر روی fab ونمایش یک دیالوگ واضافه کردن آیتم به ریسایکلر ویو:
interface AddDialogListener {
fun onAddButtonClicked(item: TodoItem)
}
کلاس مربوط به رویداد کلیک بر روی fab و اضافه کردن آیتم به ریسایکلر ویو:
class AddTodoItemDialog(context: Context, var parentId: Long, var addDialogListener: AddDialogListener) :
AppCompatDialog(context) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.dialog_add_todo_item)
tvSaveTodo.setOnClickListener {
val todo = etInputTodo.text.toString()
if (todo.isEmpty()) {
Toast.makeText(context, "Please Enter Your Todo!", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
val item = TodoItem(todo, parentId)
addDialogListener.onAddButtonClicked(item)
dismiss()
}
tvCancel.setOnClickListener {
cancel()
}
}
}
و در انتها این هم کلاس فراگمنتم هستش:
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.mytodoapp.R
import com.example.mytodoapp.data.db.TodoDatabase
import com.example.mytodoapp.data.db.models.TodoItem
import com.example.mytodoapp.data.repositories.TodoReposi tory
import com.example.mytodoapp.other.TodoRecyclerViewItemAd apter
import kotlinx.android.synthetic.main.fragment_todo.*
class TodoFragment : Fragment() {
var parentId: Long ?=0
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_todo, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val database = TodoDatabase(requireContext())
val repository = TodoRepository(database)
val factory = TodoViewModelFactory(repository)
val viewModel = ViewModelProvider(this, factory).get(TodoViewModel::class.java)
val adapter = TodoRecyclerViewItemAdapter(listOf(), viewModel)
todoRecyclerView.layoutManager = LinearLayoutManager(requireContext())
todoRecyclerView.adapter = adapter
parentId?.let {
viewModel.getChildTodoItems(it).observe(viewLifecy cleOwner, Observer {
adapter.items = it
adapter.notifyDataSetChanged()
})
}
fabAddTodoItem.setOnClickListener {
parentId?.let { it1 ->
AddTodoItemDialog(requireContext(), it1, object : AddDialogListener {
override fun onAddButtonClicked(item: TodoItem) {
viewModel.upsert(item)
Toast.makeText(context, "Parent id is: $parentId", Toast.LENGTH_SHORT).show()
}
}).show()
}
}
adapter.setOnClickRecyclerListener(object : OnClickRecyclerListener {
override fun onRecyclerItemClicked(todoItem: TodoItem) {
parentId = todoItem.id
Toast.makeText(context, "parent id is:: $parentId", Toast.LENGTH_SHORT).show()
findNavController().navigate(
R.id.action_todoFragment_self
)
parentId?.let {
viewModel.getChildTodoItems(it).observe(viewLifecy cleOwner, Observer {
adapter.items = it
adapter.notifyDataSetChanged()
})
}
}
})
}
}
و باز هم ازتون ممنونم که وقت گزاشتین و به سوام جواب دادین...
خیلی خیلی ازتون ممنونم...
دستون درد نکنه جناب صفوی...