我有一个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向我展示了这一点 正在调用adapter #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的谷歌IO谈话)
但它回来了,让我疯了......
在getView(pos = 0)显示
时设置断点时调用堆栈线程[&lt; 1&gt; main](暂停(第255行的断点) WidgetFragment $ WidgetAdapter))WidgetFragment $ WidgetAdapter.getView(int,View, ViewGroup)行:255 GridView(AbsListView).obtainView(int, boolean [])line:2456 GridView.onMeasure(int,int)行:1030 GridView(View).measure(int,int)行:15562
RelativeLayout.measureChildHorizontal(查看, RelativeLayout $ LayoutParams,int,int)line:617
RelativeLayout.onMeasure(int,int)行:399
RelativeLayout(View).measure(int,int)行:15562
FrameLayout(ViewGroup).measureChildWithMargins(View,int,int,int, int)line:5109 FrameLayout.onMeasure(int,int)line:310
FrameLayout(View).measure(int,int)行:15562 FrameLayout(ViewGroup).measureChildWithMargins(View,int,int,int, int)line:5109 FrameLayout.onMeasure(int,int)line: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, int,int,int)行:5109
答案 0 :(得分:2)
找到了解决办法 - 虽然不确定推理原因。
通过消除过程,我最终知道getView(pos = 0)调用只有在HandlerThread更新空textview之后才开始ping。我仔细检查了在正确的线程上更新UI的线程ID。
然后我开始调整textview的属性,以下组合使症状消失,第一个视图现在正确更新。基本上高度需要硬编码,match_parent有上面提到的问题而且wrap_content是根据android人员的禁忌
<TextView android:id="@+id/widget_status"
android:layout_width="match_parent"
android:layout_height="20dp"
android:gravity="center"/>
答案 1 :(得分:0)
很抱歉在此发帖,因为我暂时无法发表评论。
我遇到的问题与你相同,我所做的就是删除你的适配器并重新创建它
像往常一样一步一步:
如果可行,请根据需要完成适配器