【问题标题】:ListView performance with 2,000 items - laggy包含 2,000 个项目的 ListView 性能 - 滞后
【发布时间】:2016-02-12 20:38:03
【问题描述】:

我有一个ListView,它有 2,000 个项目。当我向下滚动时 - 第一个 appx. 300 个项目以极快的速度滚动,然后开始滞后。奇怪的是,在列表加载后,我得到了四个GC freed (some memory),当我快速滚动时,我得到更多:

Background partial concurrent mark sweep GC freed 103571(3MB) AllocSpace objects, 4(1398KB) LOS objects, 39% free, 15MB/26MB, paused 12.591ms total 122.076ms

我的ListView 有:

android:animationCache="false"
android:scrollingCache="false"

代码:

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

    if (convertView == null) {
        int type = getItemViewType(position);
        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ViewHolder holder;
        switch (type) {
            case TYPE_ITEM:
                rowView = inflater.inflate(R.layout.row_view_new, null);
                holder = new ViewHolder();
                holder.tvBrewery =(TextView) rowView.findViewById(R.id.browar);
                holder.tvTitle = (TextView) rowView.findViewById(R.id.row_title);
                //holder.tvStyle = (TextView) convertView.findViewById(R.id.gatunek);
                rowView.setTag(holder);
                break;
            case TYPE_SECTION:

                rowView = inflater.inflate(R.layout.section_row_view, null);
                holder = new ViewHolder();
                holder.tvTitle = (TextView) rowView.findViewById(R.id.row_title);
                rowView.setTag(holder);
                break;
        }
    }
    ViewHolder fHolder = (ViewHolder) rowView.getTag();
    if(mListItems.get(position).getBeerName() != null)
        fHolder.tvTitle.setText(mListItems.get(position).getBeerName());

    if(mListItems.get(position).getBrewery() != null)
        fHolder.tvBrewery.setText(mListItems.get(position).getBrewery());

    return rowView;
}

如您所见,布局层次结构非常简单 - 三个 TextView 合而为一 RelativeLayout

【问题讨论】:

  • 使用 Traceview 确定您的时间都花在了哪里。
  • @CommonsWare 我认识的第一个方法排在第 16 位,Incl Cpu Time 5475,931(或 72%)。我应该提供所有结果的屏幕吗?

标签: android performance listview android-listview


【解决方案1】:

我看到你有两种类型的行,你有没有尝试过这些功能:

getViewTypeCount() - 此方法返回信息您的列表中有多少类型的行

getItemViewType(int position) - 根据位置返回您应该使用哪种布局类型的信息

然后,只有当它为空时才膨胀布局并使用 getItemViewType 确定类型。 IMO 它将减少呆滞。

【讨论】:

  • 是的,它就是这样做的,但我在这里看不到任何解决方案。你能说清楚一点吗?
猜你喜欢
  • 2018-06-08
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多