每次滚动时都会调用 CustomAdapter getView()

CustomAdapter getView() is called every time while scrolling

我的 CustomAdapter 中的 getView() 方法在我每次向上或向下滚动时都会被调用。

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View vi = convertView;
    ViewHolder holder;
    if (convertView == null) {
        vi = inflater.inflate(R.layout.projectlist, null);

        holder = new ViewHolder();
        holder.projectTitelTextView = (TextView) vi.findViewById(R.id.projectTitle);
        holder.projectInfoTextView = (TextView) vi.findViewById(R.id.projectInfo);
        holder.projectImageImageView = (ImageView) vi.findViewById(R.id.projectImage);
        holder.projectDeadline = (TextView) vi.findViewById(R.id.projectdeadline);

        vi.setTag(holder);
    } else {
        holder = (ViewHolder) vi.getTag();
    }
    if (projectItems.size() <= 0) {
        [...]
    } else {
         [...]
        }
    }
    return vi;
}

ListView XML:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container"
android:layout_width="match_parent" android:layout_height="match_parent"
tools:context=".MainActivity" tools:ignore="MergeRootFrame">

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <ListView android:id="@+id/android:list"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:focusable="false"
        android:clickable="false"
        android:smoothScrollbar="true" />

</LinearLayout>

为什么每次向上或向下滚动时都会调用它? 假设我显示了 10 个项目。如果我向下滚动,getView() 调用一次,它会再显示一项。如果我硬滚动并想转到列表的末尾。它会被多次调用,直到数据加载并显示。

如果我想向上滚动,会发生同样的情况。

我可以做些什么来防止多次调用getView()或者是否有必要?

亲切的问候

这就是 ListAdapter 的工作原理。 getView() 在需要创建新列表项时使用,或者至少在需要使用特定位置的数据更新列表项时使用。

根据RomainGuy

的建议

This is not an issue, there is absolutely no guarantee on the order in which getView() will be called nor how many times.

ListView 适配器多次调用 getView() 方法是正常行为。

如果滚动时不需要更改某些内容,您可以尝试类似的操作。

boolean fisttime = true;

@Override public View getView(int position, View convertView, ViewGroup parent) {

if(position == 0 && isFirstRun) {
    View vi = convertView;
ViewHolder holder;
if (convertView == null) {
    vi = inflater.inflate(R.layout.projectlist, null);

    holder = new ViewHolder();
    holder.projectTitelTextView = (TextView) vi.findViewById(R.id.projectTitle);
    holder.projectInfoTextView = (TextView) vi.findViewById(R.id.projectInfo);
    holder.projectImageImageView = (ImageView) vi.findViewById(R.id.projectImage);
    holder.projectDeadline = (TextView) vi.findViewById(R.id.projectdeadline);

    vi.setTag(holder);
} else {
    holder = (ViewHolder) vi.getTag();
}
if (projectItems.size() <= 0) {
    [...]
} else {
     [...]
    }
}
return vi;
}

}