2012-01-30 5 views
2

사용자 지정 ListView를 만들었습니다. 내 ListView 어댑터의 getView 메서드를 최적화하려고했지만 여전히 지연이 발생합니다.ListView가 매우 느립니다. - Android

ListView가 지연되는 원인은 어댑터에서 무엇이 잘못 되었습니까?

아니면 좋아 보인다면 지연은 무엇일까요?

ListView에있는 행의 XML은 다음과 같습니다

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:padding="6dip" 
android:background="@color/all_white" 
android:orientation="vertical"> 
<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:padding="6dip" 
    android:background="@color/all_white" 
    android:gravity="center"> 
    <TextView 
    android:layout_width="40dip" 
    android:layout_height="wrap_content" 
    android:paddingTop="10dip" 
    android:paddingBottom="10dip" 
    /> 
<Button 
    android:layout_width="197dip" 
    android:layout_height="wrap_content" 
    android:layout_marginRight="8dip" 
    android:paddingTop="10dip" 
    android:paddingBottom="10dip" 
    android:background="@drawable/button_300" 
    android:textColor="@color/all_white"  
    /> 
<Button 
    android:layout_width="197dip" 
    android:layout_height="wrap_content" 
    android:layout_marginRight="8dip" 
    android:paddingTop="10dip" 
    android:paddingBottom="10dip" 
    android:background="@drawable/button_300" 
    android:textColor="@color/all_white"  
    /> 
<Button 
    android:layout_width="197dip" 
    android:layout_height="wrap_content" 
    android:layout_marginRight="8dip" 
    android:paddingTop="10dip" 
    android:paddingBottom="10dip" 
    android:background="@drawable/button_300" 
    android:textColor="@color/all_white" 
    /> 
<Button 
    android:layout_width="197dip" 
    android:layout_height="wrap_content" 
    android:layout_marginRight="8dip" 
    android:paddingTop="10dip" 
    android:paddingBottom="10dip" 
    android:background="@drawable/button_300" 
    android:textColor="@color/all_white"   
    />  
<Button 
    android:layout_width="197dip" 
    android:layout_height="wrap_content" 
    android:layout_marginRight="8dip" 
    android:paddingTop="10dip" 
    android:paddingBottom="10dip" 
    android:background="@drawable/button_300" 
    android:textColor="@color/all_white" 
    /> 
<Button 
    android:layout_width="197dip" 
    android:layout_height="wrap_content" 
    android:layout_marginRight="8dip" 
    android:paddingTop="10dip" 
    android:paddingBottom="10dip" 
    android:background="@drawable/button_300" 
    android:textColor="@color/all_white"   
    /> 
</LinearLayout> 
</LinearLayout> 

내 어댑터의 코드는 다음과 같습니다

이 가 MultiWorkspaceAdapter2가 BaseAdapter를 확장

공용 클래스는 {

/* 
* A map of the workspaces of a user, with key == first letter of the workspace title 
* and value == the list of WorkspaceInfos for that key. 
*/ 
private LinkedHashMap<String, List<WorkspaceInfo>> _workspacesMap; 

/* 
* Array of keys in order to get the values in getItem. 
*/ 
private String[] _keys; 

private Activity _activity; 

public MultiWorkspaceAdapter2(Activity activity, LinkedHashMap<String,  List<WorkspaceInfo>> map) { 
    _workspacesMap = map; 
    _keys = (String[]) _workspacesMap.keySet().toArray(new String[_workspacesMap.size()]); 
    _activity = activity; 
} 

public int getCount() { 
    return _workspacesMap.size(); 
} 

public Object getItem(int position) { 
    _keys = (String[]) _workspacesMap.keySet().toArray(new String[_workspacesMap.size()]); 
    List<WorkspaceInfo> list = new ArrayList<WorkspaceInfo>(); 
    try { 
     if (_keys[position] != null) { 
     list = _workspacesMap.get(_keys[position]); 
     } 
    } catch (ArrayIndexOutOfBoundsException e) { 
     list = null; 
    } 
    return list; 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewGroup viewGroup = null; 
    int numRows = 0; 

    if (convertView != null) { 
     viewGroup = (ViewGroup) convertView; 
    } else { 
     LayoutInflater inflater = (LayoutInflater) _activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     viewGroup = (ViewGroup) inflater.inflate(R.layout.multi_workspace_layout, parent, false); 

     _keys = (String[]) _workspacesMap.keySet().toArray(new String[_workspacesMap.size()]); 
     List<WorkspaceInfo> workspaces = new ArrayList<WorkspaceInfo>(); 
     try { 
      if (_keys[position] != null) { 
       workspaces = _workspacesMap.get(_keys[position]); 
       //Collections.sort(workspaces, new InfoNameComparator()); 
      } 
     } catch (ArrayIndexOutOfBoundsException e) { 
      // 
     } 

     numRows = viewGroup.getChildCount(); 

     //Find how many buttons are in a row. 
     int buttonsInRow = ((ViewGroup) viewGroup.getChildAt(0)).getChildCount(); 

     int totalRows = 0; 
     int size = workspaces.size(); 
     if (size > 0) { 
      totalRows = size/buttonsInRow + 1; 
     } 

     if (numRows < totalRows) { 
      for (int i = numRows; i < totalRows; i++) { 
       View view; 
       LayoutInflater inflater2 = (LayoutInflater) _activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       view = (View) inflater2.inflate(R.layout.list_row_multi_ws, viewGroup, false); 
       viewGroup.addView(view, i); 
      } 
     } else if (numRows > totalRows) { 
      for (int i = numRows; i > totalRows; i--) { 
       viewGroup.removeViewAt(totalRows); 
      } 
     } 

     //Iterate over workspaces 
     Iterator<WorkspaceInfo> iterator = workspaces.iterator(); 
     for (int i = 0; i < viewGroup.getChildCount(); i++) { 
      //Linear layout child containing buttons and textview. 
      ViewGroup temp = (ViewGroup) viewGroup.getChildAt(i); 
      for (int j = 0; j < temp.getChildCount(); j++) { 
       if (j == 0) { 
        //The letter these workspaces start with 
        TextView textview = (TextView) temp.getChildAt(j); 
        String letter = _keys[position]; 
        textview.setText(_keys[position]); 
        if (i != 0 && temp.getId() != R.id.workspaces_portrait) { 
         textview.setVisibility(View.INVISIBLE); 
        } else if (i != 0) { 
         textview.setVisibility(View.GONE); 
        } 
       } else { 
        //A workspace button 
        Button button = (Button) temp.getChildAt(j); 
        if (iterator.hasNext()) { 
         //Get the next workspace 
         final WorkspaceInfo workspace = iterator.next(); 
         //Get the title of the workspace and set as text. 
         String buttonText = workspace.getTitle(); 
         button.setText(buttonText); 
         button.setVisibility(View.VISIBLE); 
         //Add OnClickListener 
         button.setOnClickListener(new OnClickListener() { 
          public void onClick(View v) { 
           //If the workspace is pending, handle the invitation. 
           if (workspace.getStatus() == StaticFields.PENDING_WORKSPACE) { 
            ((SkootWorkspacesActivity) _activity).handleInvitation(workspace); 
           } else { 
            //open the workspace 
            ((SkootWorkspacesActivity) _activity).openWorkspace(workspace); 
           } 
          } 
          }); 
         button.setOnLongClickListener(new OnLongClickListener() { 
          public boolean onLongClick(View v) { 
           ((SkootWorkspacesActivity) _activity).makeDeleteDialog(workspace); 
           return true; 
          } 
          }); 
        } else { 
         button.setVisibility(View.GONE); 
        } 
       } 
      } 
     } 

    } 
    return viewGroup; 
} 

내가이 어댑터를 추가 MergeAdapter를 사용하고 MergeAdapter를 사용하여 ListView에서 setAdapter를 수행하십시오.

감사

+0

작은 개선 사항으로 행 레이아웃을 수정할 수 있으므로 기본적으로 동일한 작업을 수행하는 2 개의 LinearLayout이 없습니다. – Luksprog

+0

알았습니다. – benkdev

+0

나는 그것을 한 줄로 바꿨고 나는 여전히 많은 지체를 얻고있다. – benkdev

답변

2

문제 (지연 할 수있는 ListView)을위한 가장 좋은 방법은 홀더 클래스를 사용하여 홀더 예입니다

샘플 코드

어댑터 클래스 생성자에 ViewHolder 클래스의 객체를 생성

ViewHolder holder=new ViewHolder(); 

public View getView(int position, View convertView, ViewGroup parent) { 
     AppInfo entry = mListAppInfo.get(position); 
     ViewHolder holder = null; 

     if(convertView == null) { 
      LayoutInflater inflater = LayoutInflater.from(mContext); 
      convertView = inflater.inflate(R.layout.layout_appinfo, null); 
      holder = new ViewHolder(); 
      holder.ivIcon = (ImageView)convertView.findViewById(R.id.ivIcon); 
      holder.tvName = (TextView)convertView.findViewById(R.id.tvName); 
      convertView.setTag(holder); 
     } 
     else { 
      holder = (ViewHolder)convertView.getTag(); 
     } 

     holder.ivIcon.setImageBitmap(entry.getIcon()); 
     holder.tvName.setText(entry.getName()); 

     return convertView; 
    } 

    static class ViewHolder { 
     ImageView ivIcon; 
     TextView tvName; 
    } 
+0

자세한 내용은 아래 링크를 참조하십시오. http://www.vogella.de/articles/AndroidListView/article.html – Rajeswari

+0

제안을 주셔서 감사합니다. 지연에 더 많은 것이 있다고 생각하지만 이것은 많은 도움이 될 것입니다. – benkdev