2014-10-16 51 views
1

活动的ListView由自定义ArrayAdapter加载。当活动打开时,可以看到顶部一个和一半的列表视图项目 - 这对于高度来说可以。然而,当向下滚动时,在第三个项目被看到/加载之前的那一刻,活动暂时冻结。第三项完成装载后,根本不会冻结其他物品。什么会导致冻结?列表视图暂时冻结

这里是getView方法(没有什么可疑的,我认为):

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

    if (convertView instanceof LinearLayout) 
     return convertView; 

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View rowView = inflater.inflate(R.layout.list_item_overview, parent, false); 

    TextView venueName = (TextView) rowView.findViewById(R.id.venueName); 
    TextView requestTime = (TextView) rowView.findViewById(R.id.requestTime); 
    TextView likeCount = (TextView) rowView.findViewById(R.id.likeCount); 
    TextView commentCount = (TextView) rowView.findViewById(R.id.commentCount); 
    TextView singerName = (TextView) rowView.findViewById(R.id.singerName); 
    TextView songName = (TextView) rowView.findViewById(R.id.songName); 

    venueName.setText(feeds.get(position).getVenue().getName()); 
    requestTime.setText(TimeUtil.getFeedItemRequestedTime(feeds.get(position).getRequested_at())); 
    likeCount.setText(Integer.toString(feeds.get(position).getLikes())); 
    commentCount.setText(Integer.toString(feeds.get(position).getComments())); 
    singerName.setText(feeds.get(position).getSong().getArtist()); 
    songName.setText(feeds.get(position).getSong().getTitle()); 


    return rowView; 
} 
+0

您需要发布一些代码,特别是适配器的'getView()',以便我们了解您的问题可能是什么。 – dharms 2014-10-16 21:22:11

+0

@dcharms我添加到帖子。 – 2014-10-16 21:26:30

回答

2

原因之一,会人为增加每次的看法。在前几次之后,convertView已经被夸大了。另外,findViewById()是一个相当昂贵的电话。建议使用ViewHolder策略来减少呼叫。尝试改变,看看性能是否提高。

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

    if (convertView instanceof LinearLayout) 
     return convertView; 

    View rowView = super.getView(position, convertView, parent); 

    ViewHolder holder = (ViewHolder)convertView.getTag(); 

    if (holder == null) { 
     holder = new ViewHolder(); 
     holder.venueName = (TextView) rowView.findViewById(R.id.venueName); 
     holder.requestTime = (TextView) rowView.findViewById(R.id.requestTime); 
     holder.likeCount = (TextView) rowView.findViewById(R.id.likeCount); 
     holder.commentCount = (TextView) rowView.findViewById(R.id.commentCount); 
     holder.singerName = (TextView) rowView.findViewById(R.id.singerName); 
     holder.songName = (TextView) rowView.findViewById(R.id.songName); 
     rowView.setTag(holder); 
    } 

    holder.venueName.setText(feeds.get(position).getVenue().getName()); 
    holder.requestTime.setText(TimeUtil.getFeedItemRequestedTime(feeds.get(position).getRequested_at())); 
    holder.likeCount.setText(Integer.toString(feeds.get(position).getLikes())); 
    holder.commentCount.setText(Integer.toString(feeds.get(position).getComments())); 
    holder.singerName.setText(feeds.get(position).getSong().getArtist()); 
    holder.songName.setText(feeds.get(position).getSong().getTitle()); 


    return rowView; 
} 

private static class ViewHolder { 
    TextView venueName, requestTime, likeCount, commentCount, 
     singerName, songName; 
} 
+0

这应该优化整个列表滚动。我认为OP在UI线程上执行一些耗时的操作。如果您在主线程上执行网络操作,则API> = 11的Android可能会抛出NetworkOnMainThreadException。任何其他耗时的任务也应该在单独的工作线程上完成。想想用队列实现AsyncTask或自定义线程。 – RedScorpio 2014-10-16 21:46:59

+0

这也可能是真实的。这至少可以缓解UI线程已经做的一些工作,以处理OP向其投掷的任何内容。 – dharms 2014-10-16 21:49:12

+0

我改变了它的视图方法。但是关于冻结没有差别。 – 2014-10-17 05:41:58