gpt4 book ai didi

java - Android ListView 延迟加载的东西行为异常

转载 作者:行者123 更新时间:2023-11-30 11:42:03 29 4
gpt4 key购买 nike

我正在开发一个 Android 应用程序,其中有一些列表。它比我在这里解释的要复杂,但我发布的场景也有意外的表现。
我一直在浏览 Stack Overflow 中的几个问题,但我发现没有一个能解决这个问题。

所以,为了这个问题,我构建了这个场景。我有一个带有字符串数组的 Activity,如下所示:

public class TestViewlazyloadActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

String[] items = { "lorem", "ipsum", "dolor", "sit", "amet" };

ListView list = (ListView) findViewById(R.id.testListView);
TestAdapter adapter = new TestAdapter(this, R.layout.list_item, items);

list.setAdapter(adapter);
}
}

以这种方式作为我的两个布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ListView
android:id="@+id/testListView"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</ListView>

</LinearLayout>

这样:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
android:id="@+id/testTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

很简单。然后我用ViewHolder的思路实现了一个ArrayAdapter类,其中getView()方法如下:

public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
String item = this.getItem(position);

if(convertView == null) {
LayoutInflater inflater = ((Activity) this.getContext()).getLayoutInflater();
convertView = inflater.inflate(R.layout.list_item, null);

holder = new ViewHolder();
holder.textView = (TextView) convertView.findViewById(R.id.testTextView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

final ViewHolder auxHolder = holder;
LoadingService.capitalizeItemWithDelay(item, new LoadedCallback() {
public void onItemLoaded(String item) {
auxHolder.textView.setText(item);
}
});

return convertView;
}

成为 LoadedCallback 一个仅包含 onItemLoaded 的接口(interface)。而 LoadingService.capitalizeItemWithDelay() 只是启动一个随机 hibernate 时间的线程(以模拟延迟加载)并使用大写字符串调用此回调。

正常行为应该是用户正在查看包含 5 个空白行的列表。一段时间后,元素开始在各自的行中生成,即使在给定随机 sleep 计时器的情况下,它们的顺序也是随机的。

真正发生的是,项目被加载到第一行,一个接一个,最终其中一些被放置在它们的真实位置。这就像 auxHolder 在其 TextView 中保留对第一个元素的引用,这很奇怪。我知道这要么是因为 View 被回收,要么是因为 auxHolderfinal

有什么想法吗?提前致谢。

最佳答案

去掉 ViewHolder 变量上的 final 并将 ViewHolder auxHolder 移到内部类中。

试试这个:

   ... 
LoadingService.capitalizeItemWithDelay(item, new LoadedCallback() {
ViewHolder auxHolder = holder;
public void onItemLoaded(String item) {
auxHolder.textView.setText(item);

当您将 final 关键字与局部变量一起使用时,例如 auxHolder,您是在说您赋予它的值是它将拥有的最后一个值。这就是你遇到问题的原因。这是一个可以更好地解释的链接:http://www.javapractices.com/topic/TopicAction.do?Id=23

关于java - Android ListView 延迟加载的东西行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11952675/

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