【发布时间】:2014-09-23 01:49:07
【问题描述】:
我有一个自定义 ArrayAdapter,它为我的 ListView 使用 ArrayList<OrderedProductItem>。在这个 ListView 中,我有一个 AutoCompleteTextView,它还使用了一个带有 ArrayList<Product> 的自定义 ArrayAdapter。在初始化时,此 AutoCompleteTextView 包含所有产品的名称(大约 1250),减去 1(OrderedProductItem 的产品)。
然后用户可以使用 Spinner 来选择产品标签,然后我创建一个过滤的ArrayList<Product>,因此我只得到包含此产品标签的所有产品的列表(仍然减去 1)。所以,我的问题是:替换 ArrayAdapter 的对象列表的最佳方法是什么?
我知道我可以在我的 ListActivity 中重新创建和重新分配一个新的 ArrayAdapter 实例:
myAdapter = new MyAdapter(this, R.layout.item_view, myList);
setListAdapter(myAdapter);
我也知道我可以使用 clear 然后 addAll 来替换所有内容:
// NOTE: myAdapter.setNotifyOnChange is kept on default (true)
myAdapter.clear();
myAdapter.addAll(myList);
我想第二个可能是最好的,因为我们不想每次都创建一个新的实例,或者 ArrayAdapter 有没有像setArray() 这样的方法而我在寻找它时错过了它?或者还有比第二个选项更好的性能方法吗?
【问题讨论】:
-
你为什么害怕表演?
-
@blackbelt 嗯,首先是移动设备,所以性能应该始终是一个问题。此外,我的每个 ListView 项目都包含大约 10 个 View 元素(Spinner、ImageView、AutoCompleteTextView 等)。总而言之,我已经设法通过使用排序列表和重用实例来提高性能,并且正确现在我想保持这种方式。另外,我主要提出了这个问题,因为我找不到
setArray(),第二部分是一个for循环,将它们一一添加,但是在提出问题时我发现addAll()(它仍然使用后面的循环我能想象的场景。) -
如果您遇到性能问题,性能是一个问题。回到主要问题,较重的操作是
getView,它必须膨胀/测量/布局/绘制 ListView 的子项,并且在这两种情况下,您都在调度 it。在我看来它确实有任何区别 -
实际上,它确实有所作为。创建和设置新适配器将清除并重置列表和回收器 - 可能已被重用的视图被释放并且必须重新创建
标签: java android arraylist android-arrayadapter notifydatasetchanged