我有一个 GridView 绑定到自定义 ArrayAdapter 派生。
<GridView
android:id="@+id/measurements"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnWidth="100dp"
android:gravity="center"
android:numColumns="auto_fit"
android:orientation="horizontal"
android:stretchMode="columnWidth"/>
每个项目都膨胀为一个视图(我使用视图回收模式),如下所示。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" android:background="#8800CC00">
<TextView android:id="@+id/widget_view_id"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<TextView android:id="@+id/widget_status"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"/>
<TextView android:id="@+id/widget_timestamp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"/>
</LinearLayout>
我有一个 HandlerThread,然后定期用数据值填充每个小部件。
但是我看到第一个视图是“冻结”的 - 没有更新。 LogCat 向我展示了这一点
调用适配器#getView(position = 0) 几乎就像在循环中一样。
public class WidgetAdapter extends ArrayAdapter<DataItem>
{
private DataServiceProxy _dataServiceProxy;
public WidgetAdapter(Context context, List<DataItem> objects, DataServiceProxy dataServiceProxy) {
super(context, 0, objects);
_dataServiceProxy = dataServiceProxy;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
DataItem dataItem = getItem(position);
if (convertView == null)
{
view = getActivity().getLayoutInflater().inflate(R.layout.item_dataItem, parent, false);
view.setPadding(8, 8, 8, 8);
}
else
{
view = convertView;
int oldId = ((Integer)view.getTag()).intValue();
_dataServiceProxy.removeListener(WidgetView.getFor(view), oldId);
}
((TextView) view.findViewById(R.id.widget_view_id)).setText("View# " + dataItem.id);
view.setTag(Integer.valueOf(dataItem.id));
_dataServiceProxy.addListener(new WidgetView(view, dataItem), dataItem.id);
return view;
}
...
上次发生这种情况时,我已经修复了它 - 通过在所有 GridView 项模板子视图中将 height='wrap_content' 替换为 'match_parent' 。 (参考:Romain Guy 的 Google IO 演讲)
但它又回来了,让我发疯......
当我在 getView(pos=0) 设置断点时调用堆栈显示
线程 [ main](已挂起(断点位于第 255 行)
WidgetFragment$WidgetAdapter)) WidgetFragment$WidgetAdapter.getView(int, View,
ViewGroup)行:255 GridView(AbsListView).obtainView(int,
布尔[])行:2456 GridView.onMeasure(int,int)行:1030
GridView(View).measure(int, int) 行:15562
relativeLayout.measureChildHorizontal(视图,
relativeLayout$LayoutParams, int, int) 行:617
relativelayout.onMeasure(int,int)行:399
relativelayout(视图).measure(int,int)行:15562
FrameLayout(ViewGroup).measureChildWithMargins(View, int, int, int,
int)行:5109 FrameLayout.onMeasure(int,int)行:310
FrameLayout(View).measure(int, int) 行:15562
FrameLayout(ViewGroup).measureChildWithMargins(View, int, int, int,
int)行:5109 FrameLayout.onMeasure(int,int)行:310
FrameLayout(View).measure(int, int) 行:15562
LinearLayout.measureVertical(int, int) 行:833
LinearLayout.onMeasure(int, int) 行:574
LinearLayout(View).measure(int, int) 行:15562
PhoneWindow$DecorView(ViewGroup).measureChildWithMargins(View, int,
整数,整数,整数)行:5109