Android 之如何優化 ListView
眾所周知,在開發過程中,ListView的優化是比較重要的
那么,如何去優化呢?
ListView的提升效率,其實就是在于adapter中getView方法的優化,那么如何使的getView優化呢?
1、在getView() 中重用了convertView,很大程度上的減少了內存的消耗。通過判斷convertView是否為null,
是的話就需要產生一個視圖出來,然后給這個視圖數據,最后將這個視圖返回給底層,呈獻給用戶。
比如:listview 屏幕顯示10條數據,當用戶滑動listview的時候,第11條數據出現的時候,第一條數據
就會被android本身提供的 Recycler,將這條item(View)放進RecycleBin(回收站)中,然后顯示新視
圖的時候,從RecycleBin中重復用這個View。就不會造成每次都要去創建新的View,而節約了大量的資源。
2、自身寫一個ViewHold 類,這個ViewHolder,用來標識view中一些控件,方便進行一些事件相應操作的設置,
這樣就不用每次getView() 的View只要找一次控件就好了,不用每次都去尋找
代碼表示如下:
// getView 方法的優化public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate( R.layout.activity_list_item, null); ViewHolder viewHolder = new ViewHolder(convertView); convertView.setTag(viewHolder); } ViewHolder viewHolder = (ViewHolder) convertView.getTag(); viewHolder.fillView(getItem(position)); return convertView; }
// 這個類是View的顯示,也就是Listview的每條顯示的東西 class ViewHolder { private ImageView iv_NewsImage; private TextView tv_NewsTitle; private TextView tv_NewsDate;
public ViewHolder(View convertView) { iv_NewsImage = (ImageView) convertView.findViewById(R.id.newImage); tv_NewsTitle = (TextView) convertView.findViewById(R.id.newTitle); tv_NewsDate = (TextView) convertView.findViewById(R.id.newDate); }
public void fillView(Object item) { final NewsInfo news = (NewsInfo) item; tv_NewsTitle.setText(news.getNewTitle()); tv_NewsDate.setText(getDate(news.getNewDate())); ImageLoader.getInstance().displayImage(news.getNewImageUrl(), iv_NewsImage); }
private String getDate(long time) { Date date = new Date(time); SimpleDateFormat formatter = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); return formatter.format(date); } }</pre>