2013-08-02 3 views
0

사용자가 아닌 사용자의 입력을 받아서 listview와 관련하여 일부 수정 프로그램 이름, 전화 번호 등을 입력하는 응용 프로그램이 있습니다. 나는 모든 listview를 최적화하기 위해 viewholder를 사용했다. 모든 listviews는 userdata를로드하는 listview를 제외하고는 잘 동작합니다. 첫 번째와 마지막 행이 그러나로드 된 가운데 두 행이로드되지 않고로드하는 데 시간이 많이 걸릴 않는 것을 볼 수있다 그림에서 Viewholder가 Listview를로드하는 데 너무 많은 시간이 걸림

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를 만들고 '+'를 4 ~ 5 회 사용하는 대신 연결하려는 문자열을 추가하여 가비지 수집기가 정리해야하는 불필요한 객체를 강제로 생성해야합니다.

해피 코딩!

+0

죄송합니다 ... 코드를 여러 번 보았지만 단순한 실수를 인식하지 못했습니다. 코드와 조언을 주셔서 감사합니다. – daemon54

관련 문제