ListView相關知識小結

Android開發中,ListView常常被用來展示內容超過屏幕大小的數據,可以通過上下滑動展示內容。

ListView復用提高性能

為了提高性能,在使用ListView的時候使用ViewHolder是一個不錯的方法,通過復用超出屏幕外的convertView,在展示很多列表時只需要在剛開始時創建充滿當前屏幕的組件,在接下來的展示中,通過不斷的復用已經生成的convertView,從而極大的節省性能。

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就會被后臺發送的數據更新。這樣就會導致在滑動屏幕的時候,圖片加載錯位或者進度顯示異常。
解決方法是,對后臺任務做一判斷,當后臺任務對應的控件處于不可見狀態時停止發送更新命令。

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

            //判斷是否可見,如果可見才更新控件狀態
            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;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容