2014-10-16 62 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