0

私は ListView を使用しており、その各項目にはいくつかのコントロールが含まれています。そして、このリストビューを下にスクロールすると、かなり遅くなります。この問題を解決するためにViewHolderパターンが使用されていることを知っており、このパターンを実装しました。しかし、それは私の問題を解決しません。

私のリストビュー項目のxmlは

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

   <RelativeLayout 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"        
        android:orientation="horizontal" >

       <LinearLayout 
            android:layout_width="match_parent"
            android:layout_height="match_parent"            
            android:orientation="vertical" >            
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"    
                android:id="@+id/artistText" />
            <LinearLayout 
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginLeft="5dp"    
                android:orientation="horizontal" >          
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="10dp"   
                    android:id="@+id/titleText" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="10dp"   
                    android:id="@+id/durationText" />    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" 
                    android:text="@string/synchedSongCaption"       
                    android:id="@+id/synchedText" />
            </LinearLayout>         
        </LinearLayout>  

        <CheckBox
            android:layout_alignParentRight="true"
            android:layout_marginRight="60dp"
            android:id="@+id/toDownloadSong"
            android:layout_width="wrap_content"         
            android:layout_height="wrap_content" /> 
        <Button 
            android:layout_alignParentRight="true"
            android:id="@+id/contextMenuButton"        
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </RelativeLayout>

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

        <Button 
            android:id="@+id/cancelButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/cancelCaption"
             />
        <Button 
            android:id="@+id/pauseButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/pauseCaption" />
        <Button 
            android:id="@+id/resumeButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"            
            android:text="@string/resumeCaption" />  

     </LinearLayout>
</LinearLayout>

そして私のコードは

public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    ViewHolder holder;
    if (view == null) {
        view = lInflater.inflate(R.layout.internet_audio_view, parent, false);  
        holder = getViewHolder(view);
        view.setTag(holder);
    } else {
        holder = (ViewHolder)view.getTag();
    }
    holder.position = position;             
    Audio song = getModel(position);

    view.setOnClickListener(songItemClickListener);

    holder.titleText.setText(StringHelper.reduceText(song.title));
    holder.artistText.setText(StringHelper.reduceText(song.artist));
    holder.durationText.setText(FormatHelper.secondsToTimeStringFormat(song.duration));   


    return view;
  }

private ViewHolder getViewHolder(View view) {
    ViewHolder holder = new ViewHolder();       
    holder.artistText = (TextView) view.findViewById(R.id.artistText);
    holder.titleText = (TextView) view.findViewById(R.id.titleText);
    holder.durationText = (TextView) view.findViewById(R.id.durationText);
    holder.synchedText = (TextView) view.findViewById(R.id.synchedText);
    holder.toDownloadSong = (CheckBox) view.findViewById(R.id.toDownloadSong);
    holder.contextMenuButton = (Button) view.findViewById(R.id.contextMenuButton);
    holder.cancelButton = (Button) view.findViewById(R.id.cancelButton);
    holder.pauseButton = (Button) view.findViewById(R.id.pauseButton);
    holder.resumeButton = (Button) view.findViewById(R.id.resumeButton);
    return holder;
}

そしてViewHolderは

private class ViewHolder {
    public int position;
    public TextView titleText;
    public TextView artistText;
    public TextView durationText;
    public TextView synchedText;
    public CheckBox toDownloadSong;
    public Button cancelButton;
    public Button pauseButton;
    public Button resumeButton;
    public Button contextMenuButton;
}

しかし、それは適切に機能しません-再度スクロールすると、パフォーマンスが低下しました。どこが間違っていますか?

UPD

public static String secondsToTimeStringFormat(int seconds) {
     int minutes = seconds / SECONDS_IN_MINUTE;
     int secs = seconds % SECONDS_IN_MINUTE;
     return String.format("%d:%02d", minutes, secs);
 }

UPD2

  @Override       
  @SuppressWarnings("unchecked")
  protected T getModel(int position) {
      return ((T) getItem(position));
  }

  public Object getItem(int position) {
      return data.get(position);
  }

  protected ArrayList<T> data;   // it contains about 700-800 items. T is Audio defined below

public class Audio {    
  public String  id;   
  public String title;
  public String artist;
  public int duration;
  public String url;
  public String fileName;    
  public String OwnerId;    
  public int length;
}
4

1 に答える 1