Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android之ListView優化

Android之ListView優化

編輯:關於Android編程

面試中經常問到listView優化的問題,個人回答主要如下

1、View重用 使用setTag把view緩存起來

2、適配器在主線程修改

3、在主線程提交適配器的變化,並調用notifyDataSetChanged()方法

4、可以在任何地方獲取數據,但應該在另外一個地方請求數據,數據多次請求分次顯示


簡單實例:

package com.android.listviewtest;

import java.util.LinkedHashMap;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

	//定義view緩存對象
	static class HolderView {
		TextView showName;
		TextView showInfo;
	}

	//一次裝載 多次顯示
	private Map maps;
	// 顯示的頁數
	private int page = 1;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		maps=new LinkedHashMap();
		for (int i = 0; i < 100; i++) {
			maps.put("熊"+i, "程序員"+i+"號");
		}
		Button btshow = (Button) findViewById(R.id.bt_show);
		ListView showlist = (ListView) findViewById(R.id.listshow);
		final ShowName showName = new ShowName();
		showlist.setAdapter(showName);
		btshow.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				if (page< 100 / 5) {
					page++;
					showName.notifyDataSetChanged();
				}else{
					Toast.makeText(MainActivity.this, "沒有多余的數據了", Toast.LENGTH_LONG).show();
				}
			}
		});
	}

	class ShowName extends BaseAdapter {

		// 每次加載5條數據
		@Override
		public int getCount() {
			return page * 5;
		}

		@Override
		public Object getItem(int position) {

			return position;
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			HolderView holderView;
			//判斷每一個item中的view是否已經存在
			if (convertView == null) {
				//加載view
				convertView = LayoutInflater.from(MainActivity.this).inflate(
						R.layout.show_name, null);
				holderView = new HolderView();
				holderView.showName = (TextView) convertView
						.findViewById(R.id.txt1);
				holderView.showInfo = (TextView) convertView
						.findViewById(R.id.txt2);
				//添加一個額外的數據
				convertView.setTag(holderView);
			} else {
				holderView = (HolderView) convertView.getTag();
			}
			String name=((maps.keySet().toArray())[position]).toString();
			String info=maps.get(name);
			holderView.showName.setText(name);
			holderView.showInfo.setText(info);
			return convertView;
		}

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved