بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
یک سوال درباره adapter.notifyDataSetChanged
با سلام
من دو Adapter تعریف کردم و دو ریسایکلرویو.
که در اصل ریسایکلرویو در ریسایکلر ویو هست به این صورت که من rcv اول رو برای لیست پیامک ها و rcv2 رو برای لیست تگ ها تعریف کردم.
وقتی adapter پیامک ها یا تگ هارو notifyDataSetChanged می کنم چجوری به adapterای که داخل AdapterSms تعریف کردم بگم نوتیفای شو؟
کد هام رو قرار میدم مشاهده کنید:
AdapterSms
class AdapterSms(
@LayoutRes var layout: Int, var smsList: MutableList<Sms>,
var smsInterface: SmsInterface,
var tagInterface: TagInterface
) :
RecyclerView.Adapter<AdapterSms.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AdapterSms.ViewHolder {
var view = LayoutInflater.from(parent.context).inflate(layout, parent, false)
return AdapterSms.ViewHolder(view)
}
override fun getItemCount(): Int {
return smsList.size
}
override fun onBindViewHolder(holder: AdapterSms.ViewHolder, position: Int) {
holder.txtSender.text = smsList[position].senderMobile
holder.txtMessage.text = smsList[position].messageBody
var adapterTag = AdapterTag(R.layout.item_tag, smsList[position].tagList!!, object : TagInterface {
override fun addTag(smsId: Int) {
tagInterface.addTag(position)
}
override fun deleteTag(id: Int) {
tagInterface.deleteTag(smsList[position].tagList!![position].id!!)
}
})
val layoutManager = LinearLayoutManager(holder.rcvTag.context)
holder.rcvTag.layoutManager = layoutManager
holder.rcvTag.adapter = adapterTag
holder.fabAddTag.setOnClickListener {
tagInterface.addTag(position)
}
holder.clSmsContainer.setOnClickListener {
smsInterface.deleteSms(position)
}
holder.imgContact.setOnClickListener {
smsInterface.addSms(position)
}
}
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
var txtSender = view.findViewById<TextView>(R.id.txtSender)
var txtMessage = view.findViewById<TextView>(R.id.txtMessage)
var rcvTag = view.findViewById<RecyclerView>(R.id.rcv_tag)
var fabAddTag = view.findViewById<FloatingActionButton>(R.id.fab)
var imgContact = view.findViewById<ImageView>(R.id.img_contactImage)
var clSmsContainer = view.findViewById<ConstraintLayout>(R.id.cl_smsContainer)
}
}
AdapterTag
class AdapterTag(@LayoutRes var layoutId: Int, internal var tagList: MutableList<Tag>, var tagInterface: TagInterface) :
RecyclerView.Adapter<AdapterTag.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
var view = LayoutInflater.from(parent.context).inflate(layoutId, parent, false)
return AdapterTag.ViewHolder(view)
}
override fun getItemCount(): Int {
return tagList.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.txtTitle.text = tagList[position].title
holder.clTagContainer.setOnClickListener {
tagInterface.deleteTag(position)
}
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var txtTitle = itemView.findViewById<TextView>(R.id.txt_tag_title)
var clTagContainer = itemView.findViewById<ConstraintLayout>(R.id.cl_tagContainer)
}
}
MainActivity
class MainActivity : AppCompatActivity(), SmsInterface, TagInterface {
var smsList: MutableList<Sms>? = null
var tagList: MutableList<Tag>? = null
var adapterSms: AdapterSms? = null
override fun addTag(smsId: Int) {
Toast.makeText(this@MainActivity, "addTag CLicked!", Toast.LENGTH_SHORT).show()
var tag = Tag()
tag.id = 1
tag.title = "خوراکی"
smsList?.get(smsId)?.tagList?.add(tag)
adapterSms?.notifyDataSetChanged()
// چجوری به adapterای
// که داخل AdapterSms هست
//بگم نوتیفای شو ؟
}
override fun deleteTag(id: Int) {
Toast.makeText(this@MainActivity, "deleteTag CLicked!", Toast.LENGTH_SHORT).show()
}
override fun addSms(id: Int) {
Toast.makeText(this@MainActivity, "addSms CLicked!", Toast.LENGTH_SHORT).show()
}
override fun deleteSms(id: Int) {
Toast.makeText(this@MainActivity, "deleteSms CLicked!", Toast.LENGTH_SHORT).show()
}
@SuppressLint("WrongConstant")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
smsList = mutableListOf()
tagList = mutableListOf()
for (i in 1 until 10) {
for (j in 1..3) {
var tag = Tag()
tag.id = j
tag.title = "خرید شارژ"
tagList!!.add(tag)
}
var sms: Sms = Sms()
sms.id = i
sms.messageBody = "محتوای پیام ؟"
sms.senderMobile = "وحید گروسی"
sms.description = "محتوای پیام ؟" + i
sms.tagList = tagList
smsList!!.add(sms)
}
var rcv = findViewById<RecyclerView>(R.id.rcv_main)
val layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
rcv.layoutManager = layoutManager
adapterSms = AdapterSms(R.layout.item_sms, smsList!!, this, this)
rcv.adapter = adapterSms
}
}
برای این سوال 1 پاسخ وجود دارد.

پاسخ به سوال
Amir Ab
6 سال پیش
0
0
اینو تست کن. یه تغییراتی توش دادم
class AdapterSms(
@LayoutRes var layout: Int, var smsList: MutableList<Sms>,
var smsInterface: SmsInterface,
var tagInterface: TagInterface
) :
RecyclerView.Adapter<AdapterSms.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AdapterSms.ViewHolder {
var view = LayoutInflater.from(parent.context).inflate(layout, parent, false)
return AdapterSms.ViewHolder(view, )
}
override fun getItemCount(): Int {
return smsList.size
}
//<added>
fun updateNestedAdapter(sms: Sms) {
(sms.getViewHolder() as ViewHolder).rcvTag.adapter?.notifyDataSetChanged()
}
val holdersList: MutableList<RecyclerView.ViewHolder> = mutableListOf()
fun getViewHolder(sms:Sms): RecyclerView.ViewHolder? {
for (vh in holdersList) {
if ((vh as ViewHolder).bindedItem === sms) {
var recyclerView = RecyclerView(App.instance)
return vh
}
}
return null
}
//</added>
override fun onBindViewHolder(holder: AdapterSms.ViewHolder, position: Int) {
//<added>
if (!holdersList.contains(holder)) {
holdersList.add(holder)
}
holder.bindedItem = smsList[position]
//</added
holder.txtSender.text = smsList[position].senderMobile
holder.txtMessage.text = smsList[position].messageBody
var adapterTag = AdapterTag(R.layout.item_tag, smsList[position].tagList!!, object : TagInterface {
override fun addTag(smsId: Int) {
tagInterface.addTag(position)
}
override fun deleteTag(id: Int) {
tagInterface.deleteTag(smsList[position].tagList!![position].id!!)
}
})
val layoutManager = LinearLayoutManager(holder.rcvTag.context)
holder.rcvTag.layoutManager = layoutManager
holder.rcvTag.adapter = adapterTag
holder.fabAddTag.setOnClickListener {
tagInterface.addTag(position)
}
holder.clSmsContainer.setOnClickListener {
smsInterface.deleteSms(position)
}
holder.imgContact.setOnClickListener {
smsInterface.addSms(position)
}
}
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
//<added>
var bindedItem: Any? = null
//</added>
var txtSender = view.findViewById<TextView>(R.id.txtSender)
var txtMessage = view.findViewById<TextView>(R.id.txtMessage)
var rcvTag = view.findViewById<RecyclerView>(R.id.rcv_tag)
var fabAddTag = view.findViewById<FloatingActionButton>(R.id.fab)
var imgContact = view.findViewById<ImageView>(R.id.img_contactImage)
var clSmsContainer = view.findViewById<ConstraintLayout>(R.id.cl_smsContainer)
}
}
class AdapterTag(@LayoutRes var layoutId: Int, internal var tagList: MutableList<Tag>, var tagInterface: TagInterface) :
RecyclerView.Adapter<AdapterTag.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
var view = LayoutInflater.from(parent.context).inflate(layoutId, parent, false)
return AdapterTag.ViewHolder(view)
}
override fun getItemCount(): Int {
return tagList.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.txtTitle.text = tagList[position].title
holder.clTagContainer.setOnClickListener {
tagInterface.deleteTag(position)
}
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var txtTitle = itemView.findViewById<TextView>(R.id.txt_tag_title)
var clTagContainer = itemView.findViewById<ConstraintLayout>(R.id.cl_tagContainer)
}
}
class MainActivity : AppCompatActivity(), SmsInterface, TagInterface {
var smsList: MutableList<Sms>? = null
var tagList: MutableList<Tag>? = null
var adapterSms: AdapterSms? = null
override fun addTag(smsId: Int) {
Toast.makeText(this@MainActivity, "addTag CLicked!", Toast.LENGTH_SHORT).show()
var tag = Tag()
tag.id = 1
tag.title = "خوراکی"
//<added>
val sms=smsList?.get(smsId)?
sms.tagList?.add(tag)
adapterSms?.updateNestedAdapter(sms)
//</added>
//<removed>
// چجوری به adapterای
// که داخل AdapterSms هست
//بگم نوتیفای شو ؟
//</removed>
}
override fun deleteTag(id: Int) {
Toast.makeText(this@MainActivity, "deleteTag CLicked!", Toast.LENGTH_SHORT).show()
}
override fun addSms(id: Int) {
Toast.makeText(this@MainActivity, "addSms CLicked!", Toast.LENGTH_SHORT).show()
}
override fun deleteSms(id: Int) {
Toast.makeText(this@MainActivity, "deleteSms CLicked!", Toast.LENGTH_SHORT).show()
}
@SuppressLint("WrongConstant")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
smsList = mutableListOf()
tagList = mutableListOf()
for (i in 1 until 10) {
for (j in 1..3) {
var tag = Tag()
tag.id = j
tag.title = "خرید شارژ"
tagList!!.add(tag)
}
var sms: Sms = Sms()
sms.id = i
sms.messageBody = "محتوای پیام ؟"
sms.senderMobile = "وحید گروسی"
sms.description = "محتوای پیام ؟" + i
sms.tagList = tagList
smsList!!.add(sms)
}
var rcv = findViewById<RecyclerView>(R.id.rcv_main)
val layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
rcv.layoutManager = layoutManager
adapterSms = AdapterSms(R.layout.item_sms, smsList!!, this, this)
rcv.adapter = adapterSms
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .