【问题标题】:Why isn't getView being called for every position?为什么不为每个职位调用 getView?
【发布时间】:2020-01-15 17:27:46
【问题描述】:

我有一个简单的 GridView BaseAdapter,当单击 Grid 中的单元格时,它当然会为 Grid 中的每个位置调用 getView。在大多数情况下,getView 会为视图中的每个位置调用(应该如此),但有时只调用第一个位置。我需要为视图中的每个位置调用此方法以突出显示选定的单元格并取消突出显示其他单元格,但由于不是为每个位置调用它,它不会取消突出显示未选定的单元格。

getView 方法:

class AdapterSelectReference(context: Context, list: List<String>) : BaseAdapter()
{
    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View
    {
        Logger.log(C.LOG_I, "~*ADAPTER_SELECT_REFERENCE", object{}.javaClass.enclosingMethod?.name + ": start: position = " + position)

        val view: View
        val lrh: ListRowHolder
        if(convertView == null)
        {
            view = this.mInflator.inflate(R.layout.grid_cell_layout, parent, false)
            lrh = ListRowHolder(view)
            view.tag = lrh
        }
        else
        {
            view = convertView
            lrh = view.tag as ListRowHolder
        }
        lrh.label.text = list[position]
        if(position != Settings.referenceSelected.book)
            lrh.label.setBackgroundColor(Color.parseColor("#ffffff"))
        else
            lrh.label.setBackgroundColor(Color.parseColor("#E0E7E7"))
        return view
    }
}

活动:

class ActivitySelectReference : AppCompatActivity()
{
    lateinit var gvBooks: GridView
    lateinit var adapterBooks: AdapterSelectReference
    lateinit var listBooks: List<String>

    override fun onCreate(savedInstanceState: Bundle?)
    {
        listBooks = resources.getStringArray(R.array.bible_books).toList()
        gvBooks = findViewById(R.id.references_grid_view_books) as GridView
        adapterBooks = AdapterSelectReference(this, listBooks)
        gvBooks.setAdapter(adapterBooks)
        ...
    }   
...
}

在某个触摸时调用仅显示位置 0 的日志打印输出:

2020-01-15 09:23:16.376 26646-26646/com.samuelriesterer.custombiblereadingplan I/~*ADAPTER_SELECT_REFERENCE: getView: start: position = 0
2020-01-15 09:23:16.393 26646-26646/com.samuelriesterer.custombiblereadingplan I/chatty: uid=10283(u0_a283) com.samuelriesterer.custombiblereadingplan identical 1 line
2020-01-15 09:23:16.399 26646-26646/com.samuelriesterer.custombiblereadingplan I/~*ADAPTER_SELECT_REFERENCE: getView: start: position = 0

【问题讨论】:

  • 如果没有所有相关代码,这是不可能调查的。例如,您没有包含适配器实现的其余部分 - 由于缺少方法,当前示例无法编译。

标签: android kotlin baseadapter android-gridview getview


【解决方案1】:

不是将背景颜色设置为TextView,而是设置为view 喜欢

if(position != Settings.referenceSelected.book)
    view.setBackgroundColor(Color.parseColor("#ffffff"))
else
    view.setBackgroundColor(Color.parseColor("#E0E7E7"))

这将解决高亮/取消高亮问题

【讨论】:

  • 实际上,这并不能解决问题,即没有为每个可见视图调用 getView 方法;因此不是每次都进行突出显示。
  • 问题依然存在。问题是 GridView 中的每个位置都没有调用 getView。有时只有第一个位置调用它,而所有其他视图都没有。
  • 这很自然。 getView 仅在需要绘制视图时调用。在滚动期间,如果您滚动 2/3 个项目,那么它只会调用 2/3 次,而不是重绘整个屏幕。要获得持久的结果,请将您的状态存储在模型中,并基于此更改颜色而不是 position
  • 是的,我知道它只有在视图中并且 convertView 为空时才会绘制新视图。但它仍然应该为每个可见的视图调用 getView。问题是即使是可见视图也不会调用它。有时它根本没有被调用,所以我在方法 getView 中放什么并不重要,因为如果它没有被调用,那么它将不会执行任何突出显示。
  • 我实际上弄清楚了发生了什么。这很复杂,但我在单击任何单元格时动态调整了 3 个可见 GridView 的权重。大多数情况下,这会更新所有视图。但是,如果 GridView 权重相对于其他权重没有变化,则它不会更新。所以我只是检测到了这样的变化,如果需要的话,我在适配器上调用了 notifyDataSetChange()。
猜你喜欢
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2020-10-10
相关资源
最近更新 更多