Android開發(fā)中丈屹,ListView常常被用來展示內(nèi)容超過屏幕大小的數(shù)據(jù),可以通過上下滑動展示內(nèi)容司浪。
ListView復用提高性能
為了提高性能讹剔,在使用ListView的時候使用ViewHolder是一個不錯的方法,通過復用超出屏幕外的convertView蜈出,在展示很多列表時只需要在剛開始時創(chuàng)建充滿當前屏幕的組件田弥,在接下來的展示中,通過不斷的復用已經(jīng)生成的convertView铡原,從而極大的節(jié)省性能偷厦。
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = View.inflate(mContext, mResourceId, null);
viewHolder = new ViewHolder();
viewHolder.textView = convertView.findViewById(R.id.textView);
viewHolder.button = convertView.findViewById(R.id.button);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
class ViewHolder {
TextView textView;
Button button;
}
復用和異步加載導致的問題
當ListView的item中有諸如圖片,進度條等需要異步加載的控件時燕刻,而不加判斷時只泼,由于復用的存在,當上下滑動屏幕時卵洗,被復用的convertView就會被后臺發(fā)送的數(shù)據(jù)更新请唱。這樣就會導致在滑動屏幕的時候,圖片加載錯位或者進度顯示異常过蹂。
解決方法是十绑,對后臺任務做一判斷,當后臺任務對應的控件處于不可見狀態(tài)時停止發(fā)送更新命令酷勺。
Adapter.java
private BroadcastReceiver mDownloadReceiver = new
BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("adapter")
&& intent.getExtras() != null) {
//do sth
//判斷是否可見本橙,如果可見才更新控件狀態(tài)
if (MainActivity.isVisiable(itemBuffer.position)) {
button.setText("progress " + progress);
}
}
}
};
MainActivity.java
if (position >= mListview.getFirstVisiblePosition()
public static boolean isVisiable(int position){
boolean isVisible = false;
if (position >= mListview.getFirstVisiblePosition()
&& position <= mListview.getLastVisiblePosition()) {
isVisible = true;
}
return isVisible;
}