2013-08-02 234 views
0

我有一個應用程序,我採取的輸入,如沒有用戶,並填充一些修正名稱,電話...等方面的一個列表視圖。我使用了viewholder來優化我所有的列表視圖。所有的列表視圖都能正常工作,除了它加載用戶數據的列表視圖。Viewholder花費太多的時間來加載列表視圖

enter image description here

從你可以看到,第一個和最後行加載但不加載中間兩行採取了很多的時間來加載圖片。我提供給每一行的信息最初是相同的,留給用戶修改。這是我使用的代碼。

public View getView(final int position, View convertView,final ViewGroup parent) 
{ 
    View rowview = convertView; 
    if(rowview == null) 
    { 
     ViewHolder viewholder = new ViewHolder(); 
     final LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     rowview = inflater.inflate(R.layout.list_skeleton_people_expenses, parent, false); 
     viewholder.tv1 = (TextView)rowview.findViewById(R.id.name); 
     viewholder.tv2 = (TextView)rowview.findViewById(R.id.destination); 
     viewholder.tv3 = (TextView)rowview.findViewById(R.id.start); 
     viewholder.tv4 = (TextView)rowview.findViewById(R.id.phno); 
     viewholder.rowview = rowview; 
     rowview.setTag(viewholder); 
    } 
    else 
    { 
     ViewHolder holder = (ViewHolder) rowview.getTag(); 
     UserData temp = objects.get(position); 
     holder.tv1.setText(temp.name); 

     holder.tv2.setText("Destination: "+temp.loc); 

     holder.tv3.setText("Start: "+start); 

     String phone_txt = objects.get(position).phno; 
     phone_txt = "("+phone_txt.substring(0, 3)+") "+phone_txt.substring(3, 6)+"-"+phone_txt.substring(6, 10); 

     holder.tv4.setText(phone_txt); 
    } 
    return rowview; 
} 

static class ViewHolder 
{ 
    TextView tv1,tv2,tv3,tv4; 
    View rowview; 
} 

在此先感謝。

回答

2

您需要在if else語句之外填充文本視圖。中間的那些正在被第一個案件抓獲,並且這些財產沒有被填補。

public View getView(final int position, View convertView,final ViewGroup parent) 
{ 
    View rowview = convertView; 
    ViewHolder viewholder; 

    if (rowview == null) { 
     viewholder = new ViewHolder(); 
     final LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     rowview = inflater.inflate(R.layout.list_skeleton_people_expenses, parent, false); 
     viewholder.tv1 = (TextView)rowview.findViewById(R.id.name); 
     viewholder.tv2 = (TextView)rowview.findViewById(R.id.destination); 
     viewholder.tv3 = (TextView)rowview.findViewById(R.id.start); 
     viewholder.tv4 = (TextView)rowview.findViewById(R.id.phno); 
     viewholder.rowview = rowview; 
     rowview.setTag(viewholder);  
    } else { 
     viewholder = (ViewHolder) convertView.getTag(); 
    } 

    UserData temp = objects.get(position); 

    holder.tv1.setText(temp.name); 

    holder.tv2.setText("Destination: "+temp.loc); 

    holder.tv3.setText("Start: "+start); 

    String phone_txt = objects.get(position).phno; 
    phone_txt = "("+phone_txt.substring(0, 3)+") "+phone_txt.substring(3, 6)+"-"+phone_txt.substring(6, 10); 

    holder.tv4.setText(phone_txt); 
    return rowview; 
} 

此外,建議隨機位,儘量使用StringBuilder,而不是用「+」操作符作爲它非常低效串聯一堆串在一起的。每次使用'+'時,Java會在後臺創建一個新的StringBuilder對象,以將字符串附加到一起,因爲字符串不可變。所以不妨創建一個StringBuilder並在其中添加要連接的字符串,而不是使用「+」四次或五次,並強制它創建垃圾收集器必須清理的更多不必要的對象。

快樂編碼!

+0

糟糕...多次查看代碼,但沒有意識到這個簡單的錯誤。感謝代碼和建議。 – daemon54

相關問題