2013-05-22 2 views
0

파일 관리자를 만들고 있습니다. UI는 루트 탐색기의 UI와 비슷합니다.
하지만 내 파일 관리자에 루트 액세스를 추가 한 다음 사용자 지정 목록보기가 매우 느립니다.
많은 검색을했는데 아직 해결할 수 없습니다.내 사용자 지정 ListView가 너무 어둡습니다

코드 FileAdapter에 대한 등급 :

public class FileAdapter extends BaseAdapter { 
    private ArrayList<RootFileProperty> object; 
    ImageLoader loader = new ImageLoader(getApplicationContext()); 
    boolean isScrolling = false; 

    public FileAdapter(ArrayList<RootFileProperty> object) { 
     super(); 
     this.object = object; 
    } 

    @Override 
    public int getCount() { 
     return object.size(); 
    } 

    @Override 
    public Object getItem(int arg0) { 
     return null; 
    } 

    @Override 
    public long getItemId(int arg0) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if(convertView == null) { 
      LayoutInflater inflater = LayoutInflater.from(RootActivity.this); 
      convertView = inflater.inflate(R.layout.rootrow, parent, false); 
      holder = new ViewHolder(); 

      // Find View 
      holder.fileicon = (ImageView) convertView.findViewById(R.id.icon); 
      holder.filename = (TextView) convertView.findViewById(R.id.filename); 
      holder.filedate = (TextView) convertView.findViewById(R.id.filedate); 
      holder.fileperm = (TextView) convertView.findViewById(R.id.fileperm); 
      holder.filesize = (TextView) convertView.findViewById(R.id.filesize); 
      holder.check = (ImageView) convertView.findViewById(R.id.check); 
      convertView.setTag(holder); 
     } 
     else holder = (ViewHolder) convertView.getTag(); 

     String filename = object.get(position).getName(); 
     String filedate = object.get(position).getDate(); 
     String fileperm = object.get(position).getPerm(); 
     String filesize = object.get(position).getSize(); 

     String txtPerm = fileperm.equals("") ? "" : fileperm + " [" + Integer.toString(calcPerm(fileperm)) + "]"; 

     String dir = nowPath.equals(root) ? nowPath + object.get(position).getName() : nowPath + "/" + object.get(position).getName(); 
     if(new RootFile(dir).isDirectory()) holder.fileicon.setImageDrawable(Folder); 
     else 
     { 
      String file = getExtension(new RootFile(dir)); 
      String mimeType = getMIME(file); 
      if (file.equals("zip") || 
       file.equals("7z") || 
       file.equals("rar") || 
       file.equals("tar")) holder.fileicon.setImageDrawable(Compressed); 

      else if(mimeType == null) holder.fileicon.setImageDrawable(Others); 

      else if(mimeType.startsWith("image")) holder.fileicon.setImageDrawable(Image); 

      else if(mimeType.startsWith("audio")) holder.fileicon.setImageDrawable(Audio); 

      else if(file.equals("apk") && !isScrolling) 
      { 
       Bitmap b = ((BitmapDrawable) getApkIcon(dir)).getBitmap(); 
       loader.DisplayImage(object.get(position).getName(), b, holder.fileicon); 
      } 

      else if(file.equals("apk") && isScrolling) 
      { 
       holder.fileicon.setImageResource(R.drawable.android); 
      } 
     } 

     holder.filename.setText(filename); 
     holder.filedate.setText(filedate); 
     holder.fileperm.setText(txtPerm); 
     holder.filesize.setText(filesize); 
     holder.check.setVisibility(isSelected[position]); 
     return convertView; 
    } 
} 

static class ViewHolder { 
    ImageView fileicon; 
    TextView filename; 
    TextView filedate; 
    TextView fileperm; 
    TextView filesize; 
    ImageView check; 
} 

그리고 내 rootrow.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/rootrowlayout" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal" > 

<ImageView 
    android:id="@+id/icon" 
    android:layout_width="40dp" 
    android:layout_height="40dp" 
    android:src="@drawable/folder" /> 

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="8" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/filename" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingLeft="10sp" 
     android:textColor="?android:attr/textColorPrimary" 
     android:textSize="17sp" /> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 

     <TextView 
      android:id="@+id/filedate" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:paddingLeft="10sp" 
      android:layout_marginRight="7dp" 
      android:textColor="?android:attr/textColorSecondary" 
      android:textSize="12sp" /> 

     <TextView 
      android:id="@+id/fileperm" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="7dp" 
      android:textSize="12sp" /> 

     <TextView 
      android:id="@+id/filesize" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textColor="?android:attr/textColorSecondary" 
      android:textSize="12sp" /> 
    </LinearLayout> 
</LinearLayout> 

<ImageView 
    android:id="@+id/check" 
    android:layout_width="25sp" 
    android:layout_height="match_parent" 
    android:layout_weight="1" 
    android:src="@drawable/check" 
    android:visibility="invisible" /> 

</LinearLayout> 

그리고 내 목록보기

list = (ListView) findViewById(android.R.id.list); 

    list.setOnItemLongClickListener(new OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      SelectionItems(parent, position); 
      if(showMultiSelectToast) { showToast(getString(R.string.NowStartMultiSelectMode)); showMultiSelectToast = false; } 
      return true; 
     } 
    }); 

    list.setOnScrollListener(new OnScrollListener() {  
     public void onScrollStateChanged(AbsListView view, int scrollState) { 
      if (scrollState != 0) 
       ((FileAdapter) list.getAdapter()).isScrolling = true; 
      else { 
       ((FileAdapter) list.getAdapter()).isScrolling = false; 
       ((FileAdapter) list.getAdapter()).notifyDataSetChanged(); 
      } 
     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, 
       int visibleItemCount, int totalItemCount) { 
     } 
    }); 

    list.setScrollingCacheEnabled(false); 

정의 자원에 대한 몇 가지 설정

res = getResources(); 
Folder = res.getDrawable(R.drawable.folder); 
Others = res.getDrawable(R.drawable.others); 
Image = res.getDrawable(R.drawable.image); 
Audio = res.getDrawable(R.drawable.audio); 
Compressed = res.getDrawable(R.drawable.compressed); 

내 ImageLoader 클래스는 thest1's LazyList Project과 비슷합니다.

+0

getView() 메소드에서 너무 많은 검사를하고 있다고 생각합니다. 가능한 한 코드를 작게 유지하십시오. 이것은 모든 행과 모든 스크롤에 대해 트리거됩니다. – rahul

+0

@rahul하지만이 논리를 가능한 한 간단하게 만들었습니다 ...이 논리를 더 최적화하는 방법을 알고 있습니까? – mhkim4886

답변

0

아시다시피, 시간이 중요한 프로세스에서 새 개체 인스턴스를 만드는 데는 성능이 좋지 않습니다. 따라서 우리는 피할 수 있습니다

String mystring = new String(); 

을 그리고이 topic에서 볼 수 있듯이 실제로, 일명 문자열 연결은 :

StringBuilder sb = new StringBuilder(100); //bad for performances 
    return sb.append("fileperm ").append("[").append(...); 

당신은해야한다 :

String txtPerm = fileperm.equals("") ? "" : fileperm + " [" + Integer.toString(calcPerm(fileperm)) + "]"; 

에 컴파일러에 의해 켜집니다 모든 문자열에 대해 한 번씩 자신의 StringBuilder 인스턴스를 만들고 각 문자열 연결에 다시 사용합니다.

//global field 
StringBuilder sb = new StringBuilder(100); 

//any function that use concatenation 
public String anyFunction(){ 

    [...] 

    sb.clear(); //this is the trick : you don't creat new instance but clear the previous one to reuse it. 
    String result = sb.append(fileperm) 
         .append('[') 
         .append(...); 

    [...] 

} 

그러면 더 좋을 것입니다.

+0

그랬지, 지연은 조금 개선되었지만 지연은 여전히 ​​심각합니다 ... – mhkim4886

+0

"문자열 연결에 적용했는지 확인하고"new RootFile (dir) "=>을 만들지 않아도됩니다. 각 통화마다. – Guian

+0

수정되지 않은 경우 업데이트 된 버전을 표시 할 수 있습니다. – Guian

관련 문제