2013-08-02 149 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

相关问题