gpt4 book ai didi

android - 为什么带有自定义适配器的 ListView 有时会表现得很奇怪?

转载 作者:行者123 更新时间:2023-11-29 18:02:04 24 4
gpt4 key购买 nike

这个问题我遇到过好几次了,通过快速搜索很容易找到很多类似的问题。有时,对 ListView 行布局的动态更改也会影响其他行,有时则不会。

作为这个问题的解决方案,我通常会跟踪列表中的整组项目,每次有更改时,我都会重置列表中的所有项目。

例如:如果我有一个包含 TextView 和复选框的列表,我必须保留一个 bool 值数组来指示每个复选框的状态,并且在我的 getView() 重写上我根据该数组重置所有复选框。

这是预期的吗?我可以找到几个关于这个问题的问题,所有的解决方案似乎都和我的相似。

现在我面临一个问题,我需要在一个非常长的列表中同时跟踪多个项目(背景、复选框和文本)。我想知道是否有任何其他方法可以解决这个问题。

最佳答案

这是 Android 中 ListView 的预期行为。您使用基础数据填充列表中的 View 的方法是正确的。

Android 在创建 ListView 时使用了一种称为 View 回收的技术,因为与用数据填充 View 相比,膨胀 View 是一项密集型操作。 Android 通过仅创建用户在屏幕上看到的 View 来将通货膨胀保持在最低限度(在程序员的帮助下)。当用户向上滚动列表时,移出屏幕的 View 被放置在一个池中,以供即将显示的新项目重用。此池中的 View 作为第二个参数传递给 getView。此 View 将保留其从列表中弹出时的确切状态,因此由 getView 方法清除任何旧数据的状态,并根据基础数据的新状态重新填充它。以下是 getView() 的实现应具有的结构示例:

@Override
public View getView (int position, View convertView, ViewGroup parent)
{
//The programmer has two responsibilities in this method.

//The first is to inflate the view, if it hasn't been
//convertView will contain a view from the aforementioned pool,
// but when first creating the list, the pool is empty and convertView will be null
if(convertView == null)
{
//If convertView is null, inflate it, something like this....
convertView = layoutInflator.inflate(R.layout.mylistview, null);
}

//If convertView was not null, it has previously been inflated by this method

//Now, you can use the position argument to find this view's data and populate it
//It is important in this step to reset the entire state of the view.
//If the view that was popped off the list had a checked CheckBox,
// it will still be selected, EditTexts will not be cleared, etc.

//Finally, once that configuration is done, return convertView
return convertView;
}

Adapter 类中还有许多其他方法可以帮助管理您的列表,并允许您做一些利用 View 回收的巧妙事情,例如用于管理底层数据的 getItem(),以及 getViewType()getViewTypeCount() 用于具有多种 View 类型的列表,但以上是基本技术,也是 View 顺利运行所需的最低要求。

听起来您的方向是正确的,我希望这有助于回答您的一些问题。如果您有任何不清楚的地方或想了解更多信息,请告诉我。

关于android - 为什么带有自定义适配器的 ListView 有时会表现得很奇怪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15410906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com