使用位置0频繁调用自定义适配器getView方法

时间:2014-12-09 10:47:37

标签: android gridview adapter

我有一个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.measureChildHorizo​​ntal(查看,   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

2 个答案:

答案 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)

很抱歉在此发帖,因为我暂时无法发表评论。

我遇到的问题与你相同,我所做的就是删除你的适配器并重新创建它 像往常一样一步一步:

  • 创建适配器扩展BaseAdapter(优于ArrayAdapter,see why there
  • 实施实施方法
  • 在适配器中添加一个列表作为您的datalist
  • 编辑getCount(),getItem(),getItemId()
  • 逐步编辑getView()(使用LayoutInflater创建视图)
  • 使用列表中的2-3个数据试用您的应用

如果可行,请根据需要完成适配器