我使用的是ListView,它的每個項目都包含一些控件。當我向下滾動這個ListView時,它很慢。我知道ViewHolder模式是用來解決這個問題,我實現了這種模式。但它不能解決我的問題。Listview慢速滾動
我的ListView項的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;
}
但它不工作propwerly - 我面臨着低再次滾動時的性能。我在哪裏錯了?
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;
}
'secondsToTimeStringFormat'看起來很貴。你介意發佈嗎? – Blackbelt 2015-02-10 19:36:51
@Blackbelt我發佈了它 – Junior222 2015-02-10 19:39:19
不,它不是..'getModel'呢? – Blackbelt 2015-02-10 19:41:20