10

我已经为这个问题困扰了好几个月(但现在我正在调整性能)。但是,我现在迫切需要知道为什么我的适配器觉得有必要bindView在唱片上运行多达 4 次。

我有一个填充网格视图的自定义光标适配器。

一些调试以显示发生了什么:

03-08 14:46:47.980: I/AdapterCursorGrid(20724): newView()
03-08 14:46:48.470: I/AdapterCursorGrid(20724): bindView()
03-08 14:46:48.570: I/AdapterCursorGrid(20724): --------------------------
03-08 14:46:48.570: I/AdapterCursorGrid(20724): bindView() Record Id: 1
03-08 14:46:48.570: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0
03-08 14:46:48.570: I/AdapterCursorGrid(20724): bindView() View Type: 0
03-08 14:46:48.570: I/AdapterCursorGrid(20724): --------------------------
03-08 14:46:48.600: D/AdapterCursorGrid(20724): bindView() Avatar empty...
03-08 14:46:48.690: D/AdapterCursorGrid(20724): bindView() Picture creation...
03-08 14:46:49.490: I/AdapterCursorGrid(20724): bindView()
03-08 14:46:49.501: I/AdapterCursorGrid(20724): --------------------------
03-08 14:46:49.501: I/AdapterCursorGrid(20724): bindView() Record Id: 1
03-08 14:46:49.501: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0
03-08 14:46:49.501: I/AdapterCursorGrid(20724): bindView() View Type: 0
03-08 14:46:49.501: I/AdapterCursorGrid(20724): --------------------------
03-08 14:46:49.521: D/AdapterCursorGrid(20724): bindView() Avatar empty...
03-08 14:46:49.521: D/AdapterCursorGrid(20724): bindView() Picture creation...
03-08 14:46:50.320: I/AdapterCursorGrid(20724): newView()
03-08 14:46:51.170: I/AdapterCursorGrid(20724): bindView()
03-08 14:46:51.180: I/AdapterCursorGrid(20724): --------------------------
03-08 14:46:51.180: I/AdapterCursorGrid(20724): bindView() Record Id: 1
03-08 14:46:51.180: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0
03-08 14:46:51.190: I/AdapterCursorGrid(20724): bindView() View Type: 0
03-08 14:46:51.190: I/AdapterCursorGrid(20724): --------------------------
03-08 14:46:51.190: D/AdapterCursorGrid(20724): bindView() Avatar empty...
03-08 14:46:51.200: D/AdapterCursorGrid(20724): bindView() Picture creation...
03-08 14:46:51.870: I/AdapterCursorGrid(20724): bindView()
03-08 14:46:51.896: I/AdapterCursorGrid(20724): --------------------------
03-08 14:46:51.896: I/AdapterCursorGrid(20724): bindView() Record Id: 1
03-08 14:46:51.900: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0
03-08 14:46:51.900: I/AdapterCursorGrid(20724): bindView() View Type: 0
03-08 14:46:51.900: I/AdapterCursorGrid(20724): --------------------------
03-08 14:46:51.900: D/AdapterCursorGrid(20724): bindView() Avatar empty...
03-08 14:46:51.900: D/AdapterCursorGrid(20724): bindView() Picture creation...

“Avatar empty...”和“Picture creation...”只是简单的调试,告诉我它正在处理和更新 2 个特定ImageView的 s。

为什么 o 为什么bindView运行这么多次?这是什么原因,我能做些什么来解决这个问题?

从逻辑上讲,我希望bindView运行一次(每次更新适配器时运行一次),我这样想错了吗?

4

3 回答 3

15

操作系统可能会调用bindView多次,以便正确测量和布局列表。这不是一个错误,而是它必须的方式。这与滚动的平滑性一起,是bindView实现需要尽可能高效的原因。您可以在Android 开发者页面上详细使用一些不错的提示和技巧。

于 2013-03-08T15:30:28.430 回答
12

我还发现 bindView 的调用次数比预期的要多得多。我的 ListView 高度设置为 wrap_content。将其更改为 match_parent 后,调用次数急剧减少。

这个解决方案的功劳归功于这个问题的答案Custom CursorAdapater's bindView called 77 times...我做错了什么吗?

于 2014-06-10T11:23:02.683 回答
0

我发现的一件事ImageView是更改图像会导致ImageView请求布局,除非新图像和旧图像的大小完全相同。

在内部ImageView使用getIntrinsicWidth()getIntrinsicHeight()确定是否请求布局。

尝试这样的事情(尽管在从后台返回之前将当前宽度/高度发送到异步负载并调整位图大小会更有意义):

public void replaceBitmap(ImageView iv, Bitmap bitmap) {
    Drawable current = iv.getDrawable();
    if (bitmap.getWidth() != current.getIntrinsicHeight()
            || bitmap.getHeight() != current.getIntrinsicHeight()) {
        bitmap = Bitmap.createScaledBitmap(bitmap,
            current.getIntrinsicWidth(), current.getIntrinsicHeight(), true);
    }
    iv.setImageBitmap(bitmap);
}
于 2014-04-26T10:52:09.660 回答