android - 如何刷新/更新 listView 适配器中的数据
问题描述
所以我试图在 2 个 ListView 之间建立连接,单击第一个 ListView 中的 1 个项目后,它会更改一个数组(取决于我点击的内容),该数组作为第二个 ListView 的构造函数,它会改变背景取决于关于数组中的内容,这意味着:我单击 1. ListView 中的按钮,2. ListView 做出反应(在此示例中更改背景)。我发现了一个名为“notifyDataSetChanged”的东西,但这根本没有帮助我,我也尝试在第二个 ListView 中创建一个更新方法,但都没有成功。感谢任何帮助,谢谢
class ChoosingSpells : AppCompatActivity() {
private var learnedSpells = listOf(3,4,0,0,5,5)
private val chosenSpells = arrayOf(5,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
private var clickedSpell = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_choosing_spells)
buttonChoose.visibility = View.INVISIBLE
val listView = findViewById<ListView>(R.id.choosing_listview)
choosing_listview.adapter = LearnedSpellsView(textLabel,textLevel,textDescription,textStats, learnedSpells, clickedSpell, buttonChoose)
chosen_listView.adapter = ChosenSpellsView(chosenSpells)
buttonChoose.setOnClickListener{
for (i in 1..19) {
if(chosenSpells[i] != 0){
chosenSpells[i] = clickedSpell
buttonChoose.text = chosenSpells[i].toString()
break
}
}
}
}
private class LearnedSpellsView(var textViewLabel: TextView, var textViewLevel: TextView, var textViewDescription: TextView, var textViewStats: TextView, val learnedSpells: List<Int>, var clickedSpell:Int, var buttonChoose: Button) : BaseAdapter() {
override fun getCount(): Int {
return (learnedSpells.size/2+1)
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getItem(position: Int): Any {
return "TEST STRING"
}
override fun getView(position: Int, convertView: View?, viewGroup: ViewGroup?): View {
val rowMain: View
if (convertView == null) {
val layoutInflater = LayoutInflater.from(viewGroup!!.context)
rowMain = layoutInflater.inflate(R.layout.row_choosingspells, viewGroup, false)
val viewHolder = ViewHolder(rowMain.button1, rowMain.button2)
rowMain.tag = viewHolder
} else {
rowMain = convertView
}
val viewHolder = rowMain.tag as ViewHolder
try{
viewHolder.button1.setBackgroundResource(getDrawable(learnedSpells[if(position==0){0}else{position*2}]))
viewHolder.button2.setBackgroundResource(getDrawable(learnedSpells[if(position==0){1}else{position*2+1}]))
if(learnedSpells[if(position==0){0}else{position*2}]!=0){
viewHolder.button1.setOnClickListener {
textViewLabel.text = spellSpec(learnedSpells[if(position==0){0}else{position*2}],0)
textViewLevel.text = spellSpec(learnedSpells[if(position==0){0}else{position*2}],3)
textViewStats.text = spellSpec(learnedSpells[if(position==0){0}else{position*2}],2)
textViewDescription.text = spellSpec(learnedSpells[if(position==0){0}else{position*2}],4)
clickedSpell = learnedSpells[if(position==0){0}else{position*2}]
buttonChoose.visibility = View.VISIBLE
}
}else{
viewHolder.button1.isClickable = false
}
}catch(e:Exception){
viewHolder.button1.isClickable = false
viewHolder.button1.setBackgroundResource(getDrawable(0))
}
try{
if(learnedSpells[if(position==0){1}else{position*2+1}]!=0){
viewHolder.button2.setOnClickListener {
textViewLabel.text = spellSpec(learnedSpells[if(position==0){1}else{position*2+1}],0)
textViewLevel.text = spellSpec(learnedSpells[if(position==0){1}else{position*2+1}],3)
textViewStats.text = spellSpec(learnedSpells[if(position==0){1}else{position*2+1}],2)
textViewDescription.text = spellSpec(learnedSpells[if(position==0){1}else{position*2+1}],4)
clickedSpell = learnedSpells[if(position==0){1}else{position*2+1}]
buttonChoose.visibility = View.VISIBLE
}
}else{
viewHolder.button2.isClickable = false
}
}catch(e:Exception){
viewHolder.button2.isClickable = false
viewHolder.button2.setBackgroundResource(getDrawable(0))
}
return rowMain
}
private fun getDrawable(index:Int): Int {
return(when(index) {
3 -> R.drawable.firespell
4 -> R.drawable.icespell
5 -> R.drawable.windspell
0 -> R.drawable.shield
else -> NULL
}
)
}
private class ViewHolder(val button1: TextView, val button2: TextView)
}
private class ChosenSpellsView(var chosenSpells: Array<Int>) : BaseAdapter() {
override fun getCount(): Int {
return 20
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getItem(position: Int): Any {
return "TEST STRING"
}
fun updateAdapter(chsenSpells: Array<Int>) {
this.chosenSpells = chsenSpells
notifyDataSetChanged()
}
override fun getView(position: Int, convertView: View?, viewGroup: ViewGroup?): View {
val rowMain: View
if (convertView == null) {
val layoutInflater = LayoutInflater.from(viewGroup!!.context)
rowMain = layoutInflater.inflate(R.layout.row_chosen_spells, viewGroup, false)
val viewHolder = ViewHolder(rowMain.button1)
rowMain.tag = viewHolder
} else {
rowMain = convertView
}
val viewHolder = rowMain.tag as ViewHolder
viewHolder.button1.setBackgroundResource(getDrawable(chosenSpells[position]))
viewHolder.button1.text = (position+1).toString()
viewHolder.button1.gravity = Gravity.LEFT;
viewHolder.button1.setOnClickListener {
chosenSpells[position] = 0
viewHolder.button1.setBackgroundResource(getDrawable(chosenSpells[position]))
}
return rowMain
}
private fun getDrawable(index:Int): Int {
return(when(index) {
3 -> R.drawable.firespell
4 -> R.drawable.icespell
5 -> R.drawable.windspell
0 -> R.drawable.shield //empty slot
else -> NULL
}
)
}
private class ViewHolder(val button1: TextView)
}
}
解决方案
从适配器中使用notifyDataSetChanged()并且效果很好。
推荐阅读
- html - 锚标记大于自动调整大小的 img
- openfoam - 我应该选择哪种 OpenFOAM 求解器来模拟近岸地区的波浪产生(周期性)及其破坏?
- python - 从数据集中获取给定类名的相应类 id
- python - 从 SFMC 获取数据时标识符中的字符无效
- flutter - flutter win 10 升级 1.22 到 2.2.0 完整错误路径包后
- javascript - javascript中未定义音频标签错误
- c++ - c++ 中是否有枚举数的自动名称查找?
- dojo - dojo 1.13.0 下的文件 bower.json 和 package.json 给出了安全问题
- sql - Oracle pro*c) 获取一定数量的行(例如,50),但返回的数据数量是分散的,而不是一次。(例如,1,40,10)
- python - 从 Python2 移植到 Python3 以写入二进制文件时向字符串添加字节