Java <;安卓>;“的奇怪行为”;onListItemClick(…)";方便法

Java <;安卓>;“的奇怪行为”;onListItemClick(…)";方便法,java,android,listview,android-listfragment,Java,Android,Listview,Android Listfragment,我正在我的程序中实现一个从“ListFragment”继承的片段。这是因为我计划显示一个项目列表 我创建了一个适配器,并调用便利方法“setListAdapter(ListAdapter)”来设置适配器: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); (...) ArrayAdapter<MyClass> ada

我正在我的程序中实现一个从“ListFragment”继承的片段。这是因为我计划显示一个项目列表

我创建了一个适配器,并调用便利方法“setListAdapter(ListAdapter)”来设置适配器:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    (...)

    ArrayAdapter<MyClass> adapter =
            new ArrayAdapter<MyClass>(getActivity(),
                                    android.R.layout.simple_list_item_1,
                                    mMyClass);
    setListAdapter(adapter);
}
请注意此代码的简单性:我只是将该视图的背景颜色更改为绿色。我决定在我的Android 4.4.2手机上运行代码,发现了一个非常奇怪的行为:

视图的背景色确实会变为绿色。但是不仅是该视图的背景色,还有列表中的其他(随机选择的?)视图。

假设我的ListView中有100个视图(从0到99)。如果我点击视图#0,不仅该视图的背景色会改变,而且视图#13、视图#26、视图#39……的背景色也会改变。。。视图#91-它们平均分布。但是为什么呢

如果我以高速向下滚动列表(手指移动非常快,视图通过的速度非常快),那么我前面提到的视图将再次为白色,而其他视图则为绿色

你可以在家里试试,看看会发生什么

对此有什么合乎逻辑的解释吗?明确说明onListItemClick的v参数为:

在ListView中单击的视图


感谢

ListView回收其视图。根据您给出的数字,在100个项目的列表中,ListView中只有大约13或14个视图。例如,当您向下滚动,一个视图从顶部离开屏幕时,该视图将移动到底部,并且是下一个要显示的视图之一。如果您更改了该视图中适配器无法处理的某些属性,那么它将在循环使用后保留该属性。ArrayAdapter仅设置TextView上的文本,因此它永远不会重置视图的背景色。您需要实现一个自定义适配器。谢谢@MikeM.,解释得非常清楚。不过,我有两个问题:1)如果我真的很快地通过列表项(在列表视图中快速移动手指),那么前面提到的背景颜色已更改的视图将返回白色,而其他视图将变为绿色。为什么?2) 我想我可以通过适当重写便利方法“onListItemClick”来修改视图的属性。为什么我不能使用此方法更改背景颜色,而需要使用自定义适配器?再次感谢(我不知道为什么)1)ListView进行了大量优化,以使其滚动看起来平滑。当您快速浏览列表时,它可能会决定删除某些视图更新和显示,从而使颜色“跳跃”。2) 理想情况下,您应该只更改基础数据列表来更改ListView。适配器应该在其
getView()
方法中处理视图的设置属性,以确保每个视图的属性都是根据数据列表中的相应项设置的。
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    v.setBackgroundColor(Color.GREEN);
}