问题描述
我已成功通过适配器将数据从MainActivity传递到我的recyclerView,并且带有项目的视图正在正确呈现。但是,我需要在单击(状态)时更改项目对象的一个成员,并为此编写了一个方法(updateStatus),它的工作原理很好,它可以更改值并将其保存到数据库。
但是我无法刷新我的recyclerView,因此它可以呈现已更改的Status属性。我需要回到手机上,重新输入,然后它才能正确呈现。我已经尝试了一切,从notifyDataSetChanged到重新启动适配器,都没有运气。缺少一些东西,我找不到。
这是我的MainActivity类
class RecycleViewAdapter(var dostavneKnjiziceBP: ArrayList<DostavnaKnjizicaModel>)
: RecyclerView.Adapter<RecycleViewAdapter.ViewHolder>() {
class ViewHolder(view: View) : RecyclerView.ViewHolder(view){
val nazivPrimaoca: TextView = view.txtNazivPrimaoca
val brojposiljke: TextView = view.txtbrojposiljke
val statusDostave: TextView = view.txtStatusDostave
val imgMore: ImageView = view.img_more
val context: Context = view.context
}
override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): ViewHolder {
val layoutView = LayoutInflater.from(parent.context).inflate(R.layout.urucenje_posiljke_layout,parent,false)
return ViewHolder(layoutView)
}
override fun getItemCount() = dostavneKnjiziceBP.size
@RequiresApi(Build.VERSION_CODES.KITKAT)
override fun onBindViewHolder(holder: ViewHolder,position: Int) {
//New variable to get all modeliPosiljakaBP and their position
var dosKnjizica = dostavneKnjiziceBP[position]
val mainActivity = MainActivity()
//Sending data to layout for display in specific field
if (dosKnjizica.naziv_primaoca != null) {
holder.brojposiljke.text = "${dosKnjizica.id_dostavna_knjizica},"
holder.nazivPrimaoca.text = "${dosKnjizica.naziv_primaoca}"
if (dosKnjizica.naziv_primaoca!!.length > 25) {
holder.nazivPrimaoca.text = "${dosKnjizica.naziv_primaoca!!.subSequence(0,25)}..."
}
} else {
holder.brojposiljke.text = "${dosKnjizica.id_dostavna_knjizica}"
holder.nazivPrimaoca.text = ""
}
holder.statusDostave.text = "${dosKnjizica.status_dostave_naziv}"
when (dosKnjizica.status_dostave) {
StatusDostaveEnum.Neurucena.value -> {
holder.statusDostave.setTextColor(Color.RED)
}
StatusDostaveEnum.Uruceno.value,StatusDostaveEnum.ZaRejon.value,StatusDostaveEnum.Nadoslano.value,StatusDostaveEnum.Izgubljeno.value -> {
holder.statusDostave.setTextColor(Color.GREEN)
}
StatusDostaveEnum.Obavjesteno.value,StatusDostaveEnum.ZaNarednuDostavu.value -> {
holder.statusDostave.setTextColor(Color.BLUE)
}
StatusDostaveEnum.Retour.value -> {
holder.statusDostave.setTextColor(Color.parseColor("#dda0dd"))
}
}
//Calling menu menu_pregled_drugih_vrsta_posiljke to display menu options on click on three dots
holder.imgMore.setonClickListener {
val popupMenu = PopupMenu(holder.context,it,Gravity.START)
popupMenu.setonMenuItemClickListener { item ->
when (item.itemId) {
R.id.uruci -> {
//calling new activity from second item in dropdown menu
holder.imgMore.context.startActivity(
Intent(holder.imgMore.context,MainActivityInfo::class.java).putExtra(
"Id",dosKnjizica.id_dostavna_knjizica.toString()
)
)
true
}
//here i am calling my changeStatus method from MainActivity
R.id.obavjesti -> {
mainActivity.changeStatus(holder.context,dosKnjizica.id_dostavna_knjizica!!,StatusDostaveEnum.Uruceno.value)
Toast.makeText(holder.context,"obavjesti",Toast.LENGTH_SHORT).show()
true
}
R.id.vrati -> {
Toast.makeText(holder.context,"vrati",Toast.LENGTH_SHORT).show()
true
}
else -> false
}
}
popupMenu.inflate(R.menu.menu_urucenje_posiljke)
popupMenu.show()
}
}
}
和我的适配器类
class SoundSolver:
def __init__(self):
self.p = pyaudio.PyAudio()
self.d = dict()
def get_stream(self):
speakers = self.p.get_default_output_device_info()["hostApi"]
print(speakers)
s = self.p.open(
format=pyaudio.paInt16,channels=1,rate=44100,input=True,frames_per_buffer=CHUNK,# input_device_index=speakers
)
return s
解决方法
您的适配器没有更新的数据。最初,您从数据库中获取所有数据,并使用它创建一个适配器:async function editMovie(payload,logCallback,refreshCallback) {
const t = await sequelize.transaction();
try {
const media = await getModelMovie(false).update({
title: payload.title,disma_new_id: payload.disma_new_id,disma_old_id: payload.disma_old_id,},{
where: {
id: payload.id
}
},{
transaction: t
})
const sources_deleted = await getModelLinksSource(false,constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE).destroy({
where: {
sourceable_id: payload.id,sourceable_type: constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE
}
},{
transaction: t
})
if (payload.sources && payload.sources.length > 0) {
// do this or clone or loop and create a new array
payload.sources = JSON.parse(JSON.stringify(payload.sources))
for (let i = 0; i < payload.sources.length; i++) {
payload.sources[i].sourceable_id = payload.id
}
const sources = await getModelLinksSource(false,constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE).bulkCreate(payload.sources,{
transaction: t
})
}
const streams_deleted = await getModelLinksStreams(false,constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE).destroy({
where: {
streamable_id: payload.id,streamable_type: constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE
}
},{
transaction: t
})
if (payload.streams && payload.streams.length > 0) {
// do this or clone or loop and create a new array
payload.streams = JSON.parse(JSON.stringify(payload.streams))
for (let i = 0; i < payload.streams.length; i++) {
payload.streams[i].streamable_id = payload.id
}
const streams = await getModelLinksStreams(false,constants.MEDIA_TYPES.MEDIA_TYPE_MOVIE).bulkCreate(payload.streams,{
transaction: t
})
}
await t.commit()
if (logCallback) {
logCallback("Movie edited!",constants.LOG_TYPES.LOG_TYPE_SUCCESS)
if (refreshCallback) {
refreshCallback(null)
}
}
} catch (error) {
await t.rollback()
console.log(error)
if (logCallback) {
logCallback(`Failed editing movie! Error: ${error ? error.stack : "Unknown."}`,constants.LOG_TYPES.LOG_TYPE_ERROR)
}
}
}
。之后,您正在更新数据库,调用adapter = RecycleViewAdapter(allItems)
,但没有将数据传递给适配器。
将getAllItems(Context)
行添加到adapter.dostavneKnjiziceBP = allItems
方法中,如下所示:
changeStatus
,
将dostavneKnjiziceBP
另存为适配器内部的私有变量,并创建用于在每次更改后使用ArrayList
从适配器内部分配和更新notifyDataSetChanged()
的函数。
class RecycleViewAdapter internal constructor(
context: Context
) : RecyclerView.Adapter<RecycleViewAdapter.ViewHolder>() {
private var items = ArrayList<DostavnaKnjizicaModel>()
// ...
internal fun setItems(items: ArrayList<DostavnaKnjizicaModel>) {
this.items = items
notifyDataSetChanged()
}
override fun getItemCount() = this.items.size
}
此外,如果您知道更新项目的索引,请尝试使用adapter.notifyItemChanged(updateIndex);
。