Android Nexus 4上的Listview性能差,Nexus 7上的Listview性能好

Android Nexus 4上的Listview性能差,Nexus 7上的Listview性能好,android,performance,listview,Android,Performance,Listview,我正在开发一个Android应用程序。这个应用程序需要处理大量的列表(数千个条目,实际上是一个播放列表) 为了增加对条目重新排序的可能性,我使用了drag sort listview库。此外,每行中都有一个ProgressBar。此栏仅在当前项上可见(因此整个列表只有一个)。 然而,我在Nexus4(CM10.1.2决赛)上遇到了巨大的性能问题,而在Nexus7(2012,股票)上的性能却很好。我在尽可能快地滚动列表时跟踪了CPU使用率(不使用fastscroll机制。在Nexus 7上,CPU

我正在开发一个Android应用程序。这个应用程序需要处理大量的列表(数千个条目,实际上是一个播放列表)

为了增加对条目重新排序的可能性,我使用了drag sort listview库。此外,每行中都有一个ProgressBar。此栏仅在当前项上可见(因此整个列表只有一个)。 然而,我在Nexus4(CM10.1.2决赛)上遇到了巨大的性能问题,而在Nexus7(2012,股票)上的性能却很好。我在尽可能快地滚动列表时跟踪了CPU使用率(不使用fastscroll机制。在Nexus 7上,CPU使用率保持在30%以下,但在Nexus 4上,CPU使用率达到了80%,列表极为滞后。Logcat输出显示了这一行

I/Choreographer(639): Skipped xx frames! The application may be doing too much work on its main thread.
有几次,用户界面感觉它将使用1fps进行渲染

问题是我无法想象这样做的原因。我在适配器中使用ViewHolder模式。由于自定义字体,我还使用字体缓存

我的适配器的getView()方法:

@Override
public View getView(int position, View convertView, ViewGroup arg2) {
    PlaylistItem playlistItem = items.get(position);
    ViewHolder holder;

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.list_item_playlist, null);
        holder = new ViewHolder();
        holder.tv_artist = (TextView) convertView.findViewById(R.id.tv_artist);
        holder.tv_number = (TextView) convertView.findViewById(R.id.tv_number);
        holder.tv_number_in_queue = (TextView) convertView.findViewById(R.id.tv_number_in_queue);
        holder.tv_title = (TextView) convertView.findViewById(R.id.tv_title);
        holder.tv_track_length = (TextView) convertView.findViewById(R.id.tv_track_length);
        holder.progressBar = (ProgressBar) convertView.findViewById(R.id.progressBar1);
        holder.drag_point = (ImageView) convertView.findViewById(R.id.drag_point);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    //Show Artist and title
    holder.tv_artist.setText(playlistItem.getArtist());
    holder.tv_title.setText(playlistItem.getTitle());

    if (queuedItems.get(position) != null)
        holder.tv_number_in_queue.setText("[" + (queuedItems.get(position) + 1) + "]");
    else
        holder.tv_number_in_queue.setText("");

    //Show track length
    if (playlistItem.getLength() > -1)
        holder.tv_track_length.setText(playlistItem.getLengthInHours());
    else
        holder.tv_track_length.setText("");

    //Show index in playlist
    holder.tv_number.setText(playlistItem.getDisplayNumber());

    // Show the progressbar and set progress if the item is the currently playing one
    if (playlistItem.getIndex() == currentItem) {
        holder.progressBar.setVisibility(View.VISIBLE);
        if (currentTrackLength > 0) {
            if (holder.progressBar.getMax() != currentTrackLength) {
                holder.progressBar.setMax(currentTrackLength);
            }
            holder.progressBar.setProgress(currentTrackPos);
        } else {
            holder.progressBar.setMax(1);
            holder.progressBar.setProgress(1);
        }
    } else {
        holder.progressBar.setVisibility(View.INVISIBLE);
    }

    return convertView;
}

static class ViewHolder {
    TextView tv_number;
    TextView tv_title;
    TextView tv_artist;
    TextView tv_track_length;
    TextView tv_number_in_queue;
    ProgressBar progressBar;
    ImageView drag_point;
}
单个列表项的布局:


列表视图:

<com.mobeta.android.dslv.DragSortListView
    android:id="@+id/list_playlist"
    dslv:drag_handle_id="@+id/drag_point"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fastScrollEnabled="true"
    android:dividerHeight="0dp"
    android:divider="@null"
    dslv:drag_enabled="true"
    dslv:collapsed_height="2dp"
    dslv:drag_scroll_start="0.33"
    dslv:max_drag_scroll_speed="1.0"
    dslv:float_alpha="0.6"
    dslv:slide_shuffle_speed="0.3"
    dslv:use_default_controller="true">

</com.mobeta.android.dslv.DragSortListView>

我完全没有主意了。顺便说一下,Logcat在滚动时只显示了2到3个GC调用,所以我认为这不是原因

任何想法欢迎!谢谢


编辑:好吧,现在它变得非常奇怪。只是在HTC Desire Z(又名G2…800Mhz,512MB RAM)上运行了代码使用Android 2.3.5和Sense…即使在这里,它也比Nexus 4平滑得多?!gong在做什么?CyanogenMod会导致这种错误行为吗?我在问,因为我不想仅仅因为怀疑而刷新另一个ROM。

我也面临着同样的问题。它在HTC Desire和Nexus 7上运行良好,但在Nexus 4上运行滞后。你找到了解决方案吗使用视图持有者模式,尝试过滚动缓存、动画缓存、缓存颜色提示、快速滚动,但在Nexus 4.Hi上仍然落后。不,我还没有找到解决这个问题的方法。我感觉Android 4.4.2的效果更好了,但当你滚动得非常快时,列表仍然会结巴。我正在测试和玩发现在我的例子中,如果我不使用setImageResource调用,listview可以完美地滚动。文档中说这是一项ui密集型任务,但我在setImageBitmap和setImageDrawable方面也有滞后。在您的情况下,我认为您应该尝试使用更平坦的视图继承权。如果可行,请尝试使用一个相对布局和一个子视图好的,那么问题可能出在xml中。清单中的应用程序标记中是否有android:hardwareAccelerated=“false”?如果是,请将其删除,或将其设置为true,这是4.0+的默认值。此外,
<com.mobeta.android.dslv.DragSortListView
    android:id="@+id/list_playlist"
    dslv:drag_handle_id="@+id/drag_point"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fastScrollEnabled="true"
    android:dividerHeight="0dp"
    android:divider="@null"
    dslv:drag_enabled="true"
    dslv:collapsed_height="2dp"
    dslv:drag_scroll_start="0.33"
    dslv:max_drag_scroll_speed="1.0"
    dslv:float_alpha="0.6"
    dslv:slide_shuffle_speed="0.3"
    dslv:use_default_controller="true">

</com.mobeta.android.dslv.DragSortListView>