当前位置: 首页 > 面试题库 >

Javav正在多次调用自定义listview适配器getView方法,且调用顺序不一致

翁阳曜
2023-03-14
问题内容

我有一个自定义列表适配器:

class ResultsListAdapter extends ArrayAdapter<RecordItem> {

在重写的“ getView”方法中,我执行打印以检查位置是什么,以及它是否是convertView:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        System.out.println("getView " + position + " " + convertView);

其输出(第一次显示列表时,尚无用户输入)

04-11 16:24:05.860: INFO/System.out(681): getView 0 null  
04-11 16:24:29.020: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43d415d8  
04-11 16:25:48.070: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43d415d8  
04-11 16:25:49.110: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43d415d8  
04-11 16:25:49.710: INFO/System.out(681): getView 0 android.widget.RelativeLayout@43d415d8  
04-11 16:25:50.251: INFO/System.out(681): getView 1 null  
04-11 16:26:01.300: INFO/System.out(681): getView 2 null  
04-11 16:26:02.020: INFO/System.out(681): getView 3 null  
04-11 16:28:28.091: INFO/System.out(681): getView 0 null  
04-11 16:37:46.180: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43cff8f0  
04-11 16:37:47.091: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43cff8f0  
04-11 16:37:47.730: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43cff8f0  

AFAIK,尽管我找不到明确说明的内容,但getView()仅用于可见行。由于我的应用以四个可见行开头,因此至少位置编号从0-3循环是有意义的。但是剩下的就是一团糟:

  • 为什么每次对getview调用三遍?
  • 当我还没有滚动时,这些convertViews来自哪里?
    我做了一些研究,但没有得到一个好的答案,我确实注意到人们将这个问题与布局问题联系在一起。因此,以防万一,这是包含列表的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent" 
    android:orientation="vertical" >

    <TextView android:id="@+id/pageDetails"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" />

    <ListView android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:drawSelectorOnTop="false" />

</LinearLayout>

以及每行的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="108dp"    
android:padding="4dp">

<ImageView
    android:id="@+id/thumb"        
    android:layout_width="120dp"
    android:layout_height="fill_parent"        
    android:layout_alignParentTop="true"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_marginRight="8dp"        
    android:src="@drawable/loading" />

<TextView  
    android:id="@+id/price"
    android:layout_width="wrap_content"
    android:layout_height="18dp"         
    android:layout_toRightOf="@id/thumb"
    android:layout_alignParentBottom="true"       
    android:singleLine="true" />

<TextView  
    android:id="@+id/date"
    android:layout_width="wrap_content"
    android:layout_height="18dp"         
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true" 
    android:paddingRight="4dp"       
    android:singleLine="true" />

<TextView
    android:id="@+id/title"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="17dp" 
    android:layout_toRightOf="@id/thumb"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:paddingRight="4dp"   
    android:layout_alignWithParentIfMissing="true"
    android:gravity="center" />

</RelativeLayout>

感谢


问题答案:

这不是问题,完全不能保证调用getView()的顺序和次数。在您的特定情况下,通过给ListView一个height=wrap_content,您对它做了最坏的事情。这迫使ListView在布局时测量适配器中的几个子节点,以知道它应该有多大。这就是向ListView提供您在滚动之前看到的传递给getView()的convertView的原因。



 类似资料:
  • 问题内容: 我有一个自定义列表适配器: 在重写的“ getView”方法中,我执行打印以检查位置是什么,以及它是否是convertView: 其输出(第一次显示列表时,尚无用户输入) AFAIK,尽管我找不到明确说明的内容,但getView()仅用于可见行。由于我的应用以四个可见行开头,因此至少位置编号从0-3循环是有意义的。但是剩下的就是一团糟: 为什么每次对getview调用三次? 当我还没有

  • 问题内容: 我知道关于“多次调用getView”的问题很少,但是我的问题没什么不同。 我有一个带有自定义行的自定义listView(使用row_layout.xml)。通常效果很好。最初,我多次调用getView时遇到问题,并使用在stackoverflow中看到的一种方法解决了该问题。(使用’usedPositions’数组)。 现在,我在日志中看到这种情况:getView pos 0,getV

  • 问题内容: 我有一个风俗习惯。此行中的每一行都有一个图标和一些文本。这些图标在后台下载,缓存并使用回调(分别替换为)进行下载。每次getView()运行都会触发从缓存或下载中获取缩略图的逻辑。 现在,根据Romain Guy所说: “绝对不能保证的调用顺序和次数。 我已经看到这种情况的发生,因为大小为2的一行getView()被调用了6次! 如何更改代码以避免重复的缩略图获取请求并处理视图回收?

  • 这是我设置适配器的方式: 我正在寻找一个解决方案,从昨天开始,我已经阅读了所有关于StackOverflow的帖子,但没有一个与我的问题相匹配。所以我想知道,它是否可以来自LinkedHashMap<...> 编辑:这是我的布局r.layout.etat_piece_item

  • 问题内容: 我的片段中有一个方法。此方法启动一个新的活动。我想从我的调用此方法。 这是我的代码: HomeFragment.java StaggeredAdapter.java 我该怎么做? 问题答案: 编辑: 这是我现在要使用的。下面提供了较旧的“更轻松”的解决方案。 现在,可以从适配器中的任何位置调用该片段中的方法。 而且,除了通过构造函数提供侦听器之外,我们还可以在适配器中添加另一个方法,例

  • 问题内容: 这是我遵循的使用自定义Listview适配器的教程。我遇到的问题是,当我尝试清除适配器时,应用程序崩溃并抛出 更新的代码: 问题答案: 环顾四周,似乎是使用数组初始化适配器。请参阅带有ArrayAdapter.remove的UnsupportedOperationException和无法在ListView中修改ArrayAdapter:UnsupportedOperationExcep