Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 还有一个getView调用了多次_Android_Listview - Fatal编程技术网

Android 还有一个getView调用了多次

Android 还有一个getView调用了多次,android,listview,Android,Listview,myListView中的每个项目都包含一个ImageView和一个TextView,其中将填充远程信息 我获得了ImageView的URL,因此我启动了一个AsyncTask,该任务下载图像,并使用下载的位图调用setImageBitmap 这非常顺利,但是在创建ListView时,经常调用getView()。 对于前10行(只有7行可见),它调用了大约7倍的getView。(因此:0、1等、10、0、1等) 然后我可以平滑地滚动到第10项。但是在这之后,对于前10个项目,listview对每一

my
ListView
中的每个项目都包含一个
ImageView
和一个
TextView
,其中将填充远程信息

我获得了
ImageView
的URL,因此我启动了一个
AsyncTask
,该任务下载图像,并使用下载的位图调用
setImageBitmap

这非常顺利,但是在创建ListView时,经常调用
getView()
。 对于前10行(只有7行可见),它调用了大约7倍的
getView
。(因此:0、1等、10、0、1等)

然后我可以平滑地滚动到第10项。但是在这之后,对于前10个项目,listview对每一新行再次调用的次数大约是getView的7倍。(这将导致滞后…)

但是当我从
AsyncTask
中删除
setImageBitmap
时,这一切都不会发生

有什么问题吗?是不是有些布局太大,会导致另一个getViews连环出现

下面是一些代码:

<ListView
    android:id="@+id/mylist"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_alignParentBottom="true"
    android:layout_below="@+id/mydivider"
    android:divider="@+color/mycolor"
    android:dividerHeight="2dp"
    android:fadingEdge="none"
    android:fastScrollEnabled="true"
    android:listSelector="@android:color/transparent"
    android:scrollbars="horizontal"
    android:scrollingCache="false"
    android:smoothScrollbar="false" />
更多信息:

创建新视图时,stacktrace显示getView是从
ListView.makeAndAddView()
但是在GetView的无用连环中,它来自
ListView.measureHeigthOfChildren()


因此,当我设置位图时,布局似乎发生了变化…

我建议您观看此视频


基本上,android会多次调用getView来计算视图高度和其他内容,因此您需要在异步中实现某种缓存,如果不使用身份验证,请检查哪个缓存有问题,因为您的ListView不知道每个项目的属性。初始化时,ListView将测量其所有子项,并根据这些信息进行绘制。使用AsyncTask所做的是更改列表中项目的大小,而不是让ListView完全重新绘制自己。这会导致ListView行为异常

解决方案:您应该通过在异步任务的后期执行中使用notifyDataSetChanged()通知适配器来更新ListView。这将允许ListView使用新信息绘制自身

我希望它能起作用

以下是一些有用的完整链接:


问题出在ListView的布局中


当我将参数
layout\u width
更改为
wrap\u content
时,该参数被设置为
wrap\u content
,问题消失了…

很抱歉回复太晚。我在gallery小部件的适配器中也遇到了同样的问题。我使用了通用图像加载器Martijn的解决方案对我有效。我所要做的就是在图像完全下载并设置imageView时添加notifyDataSetChanged()

我尝试在ListView中使用fill\u parent作为高度,但我无法完美实现,但我曾经尝试过阻止创建ConvertView,如果它已经存在的话。我觉得它很好用

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
         if (convertView != null)
            return convertView;
         else {
            //your code...
         }
    }

是的,看起来如此,甚至我认为当图像被添加时,父级应该重新布局它自己,因为父级高度也会受到影响..但这是我认为不确定的..看这个链接:notifyDataSetChanged在我只想更新一个视图时不会有帮助。我不会改变阵列的谢谢你。工作100%,也为我工作。我想知道这是否与listView的固有大小受到限制有关,如果它匹配其父级而不是填充它?较大的listView在逻辑上会更频繁地调用getView(),因为有更多的单个项目可用。在我的例子中,getView被反复无限地调用一个位置,即使这个位置并不特别。我在同一屏幕上有多个视图类型,就像那样,还有一个视图类型。问题是,我在一个布局中有多个项目,其中一个项目的宽度由layoutwweight=“1”确定,以在其他小部件之后占据剩余空间。将其重新设置为固定宽度解决了问题。不敢相信这实际上解决了我的问题+1.这真是难以置信。我有一个ViewPager,每个页面都有一个ListFragment,我调试了几个星期,试图弄清楚为什么刷卡如此频繁。在这段时间里,我所要做的就是将ListView的高度设置为
match\u parent
row = convertView;
ViewHolder holder;
if (row == null) {
    row = vi.inflate(R.layout.mylayout, null);
    holder = new ViewHolder();
    holder.image = (ImageView) row.findViewById(R.id.myimage);
    holder.title = (TextView) row.findViewById(R.id.mytext);
    row.setTag(holder);
} else {
    holder = (ViewHolder) row.getTag();
}

holder.title.setText("text");
holder.image.setImageResource(R.drawable.mydefaulticon);
holder.position = position;
startMyTask(content, holder, position);
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
         if (convertView != null)
            return convertView;
         else {
            //your code...
         }
    }