android: BaseAdapter和ListView簡單運用(08)

//BaseAdapter和ListView簡單運用
public class MainActivity extends Activity {
	private ListView listview;
	private List<String> list;
	private MyBaseAdapter adapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.listview = (ListView) this.findViewById(R.id.listview);
		// 簡單得給點數據
		list = new ArrayList<String>();
		for (int i = 0; i < 100; i++) {
			list.add("item" + i);
		}
		adapter = new MyBaseAdapter(list);
		listview.setAdapter(adapter);// 綁定適配器
	}

	class MyBaseAdapter extends BaseAdapter {
		private List<String> list;

		public MyBaseAdapter(List<String> list) {
			this.list = list;
		}

		@Override
		public int getCount() {
			// 返回總的數量
			return this.list.size();
		}

		@Override
		public Object getItem(int position) {
			// 得到點擊選中的位置
			return this.list.get(position);
		}

		@Override
		public long getItemId(int position) {
			// 當前行的id
			return position;
		}

		@Override
		// 每加載一項(item)都要調用該方法,返回當前的視圖;在屏幕的
		// 第一屏時convertView爲null,一屏事後不爲null
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder vHolder;
			if (convertView == null) {// 在第一屏調用時
				vHolder = new ViewHolder();
				// 把item_listview.xml佈局文件轉換爲java對象(佈局(視圖)對象)
				// 使用佈局填充器生成getLayoutInflater()
				// 三種方式文件佈局關聯,這是最簡單的一種
				convertView = getLayoutInflater().inflate(
						R.layout.item_listview, null);
				// 第二種:
				// LayoutInflater.from(MainActivity.this).inflate(R.layout.item_listview,
				// null);
				// 第三種:經過系統服務拿到生成器,再進行佈局,前面兩種底層都是調用第三種
				LayoutInflater inflater = (LayoutInflater) getSystemService(Service.LAYOUT_INFLATER_SERVICE);
				inflater.inflate(R.layout.item_listview, null);// root父容器的佈局,設置爲null,會自動給我佈局
				TextView text_info = (TextView) convertView
						.findViewById(R.id.text_info);
				// 將找到控件的(id)名賦值給封裝類(javaBean)保存
				vHolder.text_info = text_info;
				// 設置一個標記,方便第二屏調用(重用這個)
				convertView.setTag(vHolder);
				Log.i("MainActivity", this.list.get(position));
			} else {
				// 第二屏調用時,重用第一屏的item(控件id名)
				vHolder = (ViewHolder) convertView.getTag();
			}
			// 把當前行的的內容設置給text_info顯示
			vHolder.text_info.setText(this.list.get(position));
			return convertView;
			/*
			 * //以上代碼是下面的優化,優化後不會每一次都建立item,而是重用item,可是要建一個ViewHolder類
			 * //把item_listview.xml佈局文件轉換爲java對象(佈局(視圖)對象)
			 * //使用佈局填充器生成getLayoutInflater()
			 * convertView=getLayoutInflater().inflate(R.layout.item_listview,
			 * null); TextView text_info=(TextView)
			 * convertView.findViewById(R.id.text_info); Log.i("MainActivity",
			 * this.list.get(position)); //把當前行的內容設置給text_info
			 * text_info.setText(this.list.get(position)); return
			 * convertView;//返回當前行的視圖,而後把視圖放到listview(父容器)
			 */
		}

	}

	class ViewHolder {
		private TextView text_info;// 佈局中元素的封裝類
	}
}

//主佈局文件
<ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

//適配器綁定的自定義佈局文件
  <TextView
        android:id="@+id/text_info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="" />
相關文章
相關標籤/搜索