2012-07-07 3 views
0

ArrayAdapter를 사용하여 listView를 만듭니다. 모든 항목에는 여러보기가 있습니다. 이것은 getView() 메소드의 코드입니다.매우 느린 listView 어댑터

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

    ViewHolder holder; 

    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.dialog_list_view, null); 
     holder = new ViewHolder(); 
     holder.date = (TextView)convertView.findViewById(R.id.date); 
     holder.multi_chat = (ImageView)convertView.findViewById(R.id.multi_chat); 
     holder.my_userpick = (ImageView)convertView.findViewById(R.id.my_userpic); 
     holder.name = (TextView)convertView.findViewById(R.id.name); 
     holder.photo1 = (ImageView)convertView.findViewById(R.id.photo1); 
     holder.photo2 = (ImageView)convertView.findViewById(R.id.photo2); 
     holder.photo31 = (ImageView)convertView.findViewById(R.id.photo31); 
     holder.photo32 = (ImageView)convertView.findViewById(R.id.photo32); 
     holder.photo33 = (ImageView)convertView.findViewById(R.id.photo33); 
     holder.photo41 = (ImageView)convertView.findViewById(R.id.photo41); 
     holder.photo42 = (ImageView)convertView.findViewById(R.id.photo42); 
     holder.photo43 = (ImageView)convertView.findViewById(R.id.photo43); 
     holder.photo44 = (ImageView)convertView.findViewById(R.id.photo44); 

     holder.text = (TextView)convertView.findViewById(R.id.text); 
     holder.userpic = (ImageView)convertView.findViewById(R.id.userpic); 
     holder.userpick2 = convertView.findViewById(R.id.userpick2); 
     holder.userpick3 = convertView.findViewById(R.id.userpick3); 
     holder.userpick4 = convertView.findViewById(R.id.userpick4); 
     holder.wrapper = (RelativeLayout)convertView.findViewById(R.id.wrapper); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    if (dialogs != null) { 
     if (position == (this.getCount() - 1)) { 
      if (dialogs != null) { 
       if (dates.size() > 1) { 
        dialogs.getDialogs(dates.size()+20); 
       } 
      } 
     } 
    } 

    if (dates.get(position).getChatId() != 0) { 
     holder.name.setText(dates.get(position).getTitle()); 
     holder.multi_chat.setVisibility(View.VISIBLE); 
    } else { 
     holder.name.setText(dates.get(position).getUidDates()); 
     holder.multi_chat.setVisibility(View.GONE); 
    } 

    if (dates.get(position).getReadState() == 0) { 
     holder.wrapper.setBackgroundColor(getResources().getColor(R.color.conversation_list_no_read)); 
    } else { 
     holder.wrapper.setBackgroundColor(android.R.color.white); 
    } 

    holder.text.setText(dates.get(position).getBody()); 

    int date = dates.get(position).getDate(); 
    java.util.Date time = new java.util.Date((long) date * 1000); 

    if ((time.getDate() == current_date.getDate()) && (time.getMonth() == current_date.getMonth()) && (time.getYear() == current_date.getYear())) { 
     holder.date.setText(time.getHours() + ":" + time.getMinutes()); 
    } else if ((time.getDate() == (current_date.getDate() - 1)) && (time.getMonth() == current_date.getMonth()) && (time.getYear() == current_date.getYear())) { 
     holder.date.setText("вчера"); 
    } else { 
     holder.date.setText(time.getDate() + "." + time.getMonth() + "." + (time.getYear()+1900)); 
    } 

    if(!dates.get(position).getPhotoInText().equals("")) { 
     loaderWithoutCut.displayImage(dates.get(position).getPhotoInText(), holder.my_userpick, false); 
     holder.my_userpick.setVisibility(View.VISIBLE); 
     holder.text.setBackgroundDrawable(getResources().getDrawable(R.drawable.dialog_rect_bg)); 
     holder.text.setPadding(10, 0, 10, 0); 
     holder.text.setGravity(Gravity.CENTER_VERTICAL); 
     holder.text.setSingleLine(true); 
     holder.text.setEllipsize(TextUtils.TruncateAt.END); 
    } else { 
     holder.my_userpick.setVisibility(View.GONE); 
     holder.text.setBackgroundColor(getResources().getColor(android.R.color.transparent)); 
     holder.text.setPadding(0, 0, 0, 0); 
     holder.text.setSingleLine(false); 
     holder.text.setGravity(Gravity.TOP); 
    } 


    ArrayList photos = dates.get(position).getUidPhotos(); 

    if (dates.get(position).getChatId() == 0) { 
     if (photos.size() == 1) { 
      loaderWithoutCut.displayImage((String) photos.get(0), holder.userpic, false); 

      holder.userpick2.setVisibility(View.GONE); 
      holder.userpick3.setVisibility(View.GONE); 
      holder.userpick4.setVisibility(View.GONE); 
      holder.userpic.setVisibility(View.VISIBLE); 

     } 
    } else { 
     if ((photos.size() < 3) && (photos.size()>0)) { 

      if (photos.size() == 1) { 
       holder.photo1.setVisibility(View.GONE); 
       loaderWithCut.displayImage((String) photos.get(0), holder.photo2, true); 
      } else { 
       holder.photo1.setVisibility(View.VISIBLE); 
       loaderWithCut.displayImage((String) photos.get(1), holder.photo2, true); 
       if (!((String) photos.get(1)).equals((String) photos.get(0))) { 
        loaderWithCut.displayImage((String) photos.get(0), holder.photo1, true); 
       } else { 
        holder.photo1.setVisibility(View.GONE); 
       } 
      } 

      holder.userpic.setVisibility(View.GONE); 
      holder.userpick2.setVisibility(View.VISIBLE); 
      holder.userpick3.setVisibility(View.GONE); 
      holder.userpick4.setVisibility(View.GONE); 

     } 

     if (photos.size() == 3) { 
      loaderWithCut.displayImage((String) photos.get(0), holder.photo31, true); 

      loaderWithoutCut.displayImage((String) photos.get(1), holder.photo32, false); 
      loaderWithoutCut.displayImage((String) photos.get(2), (ImageView) holder.photo33, false); 


      holder.userpic.setVisibility(View.GONE); 
      holder.userpick2.setVisibility(View.GONE); 
      holder.userpick3.setVisibility(View.VISIBLE); 
      holder.userpick4.setVisibility(View.GONE); 

     } 

     if (photos.size() >= 4) { 
      loaderWithoutCut.displayImage((String) photos.get(0), holder.photo41, false); 
      loaderWithoutCut.displayImage((String) photos.get(1), holder.photo42, false); 
      loaderWithoutCut.displayImage((String) photos.get(2), holder.photo43, false); 
      loaderWithoutCut.displayImage((String) photos.get(3), holder.photo44, false); 

      holder.userpic.setVisibility(View.GONE); 
      holder.userpick2.setVisibility(View.GONE); 
      holder.userpick3.setVisibility(View.GONE); 
      holder.userpick4.setVisibility(View.VISIBLE); 

     } 

    } 

    if (photos.size() == 0) { 

     holder.userpick2.setVisibility(View.GONE); 
     holder.userpick3.setVisibility(View.GONE); 
     holder.userpick4.setVisibility(View.GONE); 

    } 


    final ViewHolder holder2 = holder; 
    convertView.setOnFocusChangeListener(new View.OnFocusChangeListener() { 

     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 

      TextView text = holder2.text; 
      TextView date = holder2.date; 
      TextView name = holder2.name; 

      if (hasFocus) { 
       text.setTextColor(getResources().getColor(android.R.color.white)); 
       date.setTextColor(getResources().getColor(android.R.color.white)); 
       name.setTextColor(getResources().getColor(android.R.color.white)); 
      } else { 
       text.setTextColor(getResources().getColor(R.color.dialog_text)); 
       date.setTextColor(getResources().getColor(R.color.dialog_date)); 
       name.setTextColor(getResources().getColor(R.color.friends_text_color)); 
      } 
     } 
    }); 

    return convertView; 
} 

문제는 - 목록보기 스크롤 작업이 매우 느립니다. 어떻게이 문제를 해결할 수 있습니까? 레이아웃의 코드 :

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:gravity="center_vertical" android:background="@drawable/list_drawable_settings"> 
    <RelativeLayout 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:gravity="center_vertical" android:id="@+id/wrapper"> 
     <LinearLayout android:layout_width="52dip" android:id="@+id/images" android:layout_margin="6dip" 
         android:layout_height="58dip"> 
      <com.vk.messenger.views.RoundedConersImageView android:id="@+id/userpic" 
         android:layout_height="wrap_content" android:layout_width="wrap_content" 
         /> 
      <LinearLayout android:layout_width="wrap_content" android:id="@+id/userpick2" 
          android:layout_height="wrap_content"> 
       <LinearLayout android:layout_width="26dip" 
           android:layout_height="58dip"> 
        <com.vk.messenger.views.ScalledImageView android:scaleType="fitCenter" 
           android:cropToPadding="true" android:layout_width="26dip" 
           android:layout_height="58dip" 
           android:id="@+id/photo1"/> 
       </LinearLayout> 
       <LinearLayout android:layout_width="26dip" 
           android:layout_height="58dip"> 
        <com.vk.messenger.views.ScalledImageView android:layout_width="26dip" 
                  android:layout_height="58dip" android:scaleType="fitCenter" 
           android:cropToPadding="true" 
           android:id="@+id/photo2"/> 
       </LinearLayout> 
      </LinearLayout> 
      <LinearLayout android:layout_width="wrap_content" android:id="@+id/userpick3" 
          android:layout_height="wrap_content"> 
       <ImageView android:layout_width="26dip" android:layout_height="58dip" android:id="@+id/photo31" 
         ></ImageView> 
       <LinearLayout android:layout_width="26dip" android:id="@+id/userpick3" 
           android:layout_height="58dip" 
           android:orientation="vertical"> 
        <ImageView android:layout_width="26dip" 
           android:scaleType="fitCenter" android:cropToPadding="true" 
           android:layout_height="26dip" android:id="@+id/photo32" 
          ></ImageView> 
        <ImageView android:layout_width="26dip" 
           android:scaleType="fitCenter" android:cropToPadding="true" 
           android:layout_height="29dip" android:id="@+id/photo33" 
          ></ImageView> 
       </LinearLayout> 
      </LinearLayout> 
      <LinearLayout android:layout_width="52dip" android:id="@+id/userpick4" 
          android:layout_height="58dip" android:orientation="horizontal"> 
       <LinearLayout android:layout_width="26dip" 
           android:layout_height="58dip" 

           android:orientation="vertical"> 
        <ImageView android:layout_width="26dip" 
           android:layout_height="29dip" android:id="@+id/photo41" 
          ></ImageView> 
        <ImageView android:layout_width="26dip" 
           android:layout_height="29dip" android:id="@+id/photo42" 
          ></ImageView> 
       </LinearLayout> 
       <LinearLayout android:layout_width="26dip" 
           android:layout_height="58dip" 
           android:orientation="vertical"> 
        <ImageView android:layout_width="26dip" 
           android:layout_height="29dip" android:id="@+id/photo43" 
          ></ImageView> 
        <ImageView android:layout_width="26dip" 
           android:layout_height="29dip" android:id="@+id/photo44" 
          ></ImageView> 
       </LinearLayout> 
      </LinearLayout> 
     </LinearLayout> 

     <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" 
         android:layout_centerVertical="true" 
         android:layout_toRightOf="@id/images" android:layout_marginLeft="4dip"> 
      <LinearLayout android:layout_width="fill_parent" android:orientation="vertical" android:id="@+id/left" android:layout_height="wrap_content"> 
      <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> 
       <ImageView android:id="@+id/multi_chat" android:visibility="invisible" android:paddingTop="3dip" android:paddingRight="2dip" 
          android:src="@drawable/multi_chat" 
          android:layout_height="wrap_content" android:layout_width="wrap_content" 
         /> 
       <com.vk.messenger.views.TextViewMyriadPro android:id="@+id/name" android:text="" android:singleLine="true" android:ellipsize="end" 
          android:layout_centerVertical="true" 
          android:textColor="@color/friends_text_color" android:textSize="16dip" android:textStyle="bold" 
          android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_weight="1"/> 
       <com.vk.messenger.views.TextViewHelvetica android:id="@+id/date" android:layout_marginLeft="6dip" android:gravity="right" android:layout_marginRight="6dip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/dialog_date" 
                  android:textSize="13dip"/> 
      </LinearLayout> 
      <LinearLayout android:layout_height="wrap_content" 
          android:layout_width="fill_parent" android:layout_weight="1" android:layout_marginTop="2dip"> 
       <com.vk.messenger.views.RoundedConersImageView android:id="@+id/my_userpic" android:visibility="gone" android:paddingRight="2dip" 
          android:layout_height="30dip" android:layout_width="30dip"/> 
       <com.vk.messenger.views.TextViewHelvetica android:id="@+id/text" android:text="текст" android:layout_below="@id/name" 
          android:layout_centerVertical="true" android:layout_marginLeft="3dip" android:layout_marginRight="6dip" 
          android:textColor="@color/dialog_text" android:textSize="13dip" 
          android:layout_height="fill_parent" 
          android:layout_width="fill_parent" /> 
      </LinearLayout> 
      </LinearLayout> 
     </RelativeLayout> 

    </RelativeLayout> 
</LinearLayout> 
+0

이것이 행 레이아웃이면 'ListView'가 느리다는 것은 놀랄 일이 아닙니다. – Luksprog

+0

모든 하위 레이아웃의 핵심은 무엇입니까? 가능한 한 적은 레이아웃 유형으로 해보십시오. –

+0

원칙 - 다른 항목에 1, 2, 3 또는 4 개의 이미지를 표시 할 수 있어야합니다. 모든 이미지는 인터넷에서 비동기 적으로 다운로드됩니다. 보다 효과적인 레이아웃을 만드는 방법이 있습니까? – Anton

답변

0

내가 모든 코드는 모든 눈에 보이는 목록 항목에 대한 스크롤하려고 할 때마다 실행해야합니다, 당신은 단순히의 getView에 너무 많은 일을 생각은, 단순히 일이 너무 많이있다.

또한 loadWithCut/loadWitoutCut은 무엇입니까? 어디에서 이미지를로드하고 있습니까? getview에서 이미지를 조작하고 있습니까?

가능한 경우 객체 생성을 getView 밖으로 이동 한 다음 다양한 방법으로 로깅을 수행하여 속도 저하가 정확히 어디에서 발생하는지 확인합니다.

+0

loadWithCut/loadWitoutCut - 인터넷에서 이미지를 비동기 적으로로드하는 클래스입니다. 나는이 vorking이 천천히 있기 때문에 천천히 setVisibility()라고 생각한다. setVisibility 대신 특정 순서로 그림이있는 RelativeLayouts를 정렬하는 방법이 있습니까? 레이아웃을 단순화하는 데 도움이 될 수 있습니까? 원칙 - 다른 요소 1, 2, 3 또는 4 이미지를 표시 할 수 있어야합니다. – Anton

0

중첩 된 LinearLayouts을 제거하는 방법을 살펴 보겠습니다. LinearLayouts 중첩 대신 RelativeLayout을 사용해야합니다. 특히 LinearLayouts을 중첩하는 경우 너무 많은 이미지를 사용하고 있기 때문에 레이아웃 재구성을 고려할 수 있습니다. 여기에 방법과 이유에 대해 이야기 기사입니다 : 당신은 또한 당신의 getView 방법을 파괴하는 것이 좋습니다

http://android-developers.blogspot.com/2009/02/android-layout-tricks-1.html

가, 거기에 어떤 일이 일어나고 많은있다. getView은 각 호출에 대해 해당 코드의 대부분을 수행해야하므로 아마도 문제의 원인이 될 수 있습니다. 다른 클래스를 만드는 것을 고려해야합니다.

+0

해결책이 보이지 않습니다. 문제 - 그 크기와 위치가 다른 1,2,3,4 개의 이미지를 표시 할 수있는 기회가 있어야합니다. 그것을하는 방법? 제발, 나에게 아이디어를 줘) – Anton