Listview和 Adapter


到公司也已經幾個月了一直在寫項目,拿着同事的Demo 通過打log 一點一點的寫。log測試發現通過 OK,接着打下一個log

日子就這樣反覆過了4個月。項目也寫的差不多了,卻悲劇的發現自己能寫點東西,也能該點東西,可是沒Demo讓自己去寫,就會顯得無從下手。

所以寫文章開始總結知識點,當然這裏很多是在百度上百度的,然後通過自己寫,運行,總結寫進來的。供自己以後回顧,如果你看到這篇文章有不懂的地方歡迎留言,大家一起探討。也許你的問題我並不能給你滿意的答案。

 ListView 和Adapter
工作原理:(1)ListView 針對List中的每一個item,要求adapter“給我一個視圖”(getview)

                    (2)getView 返回視圖

   

package bsn.cc.dd;

import java.util.ArrayList;

import android.R.integer;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;


public class ListView extends ListActivity{
	private MyAdapter adapter;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		adapter=new MyAdapter();
		for (int i = 0; i < 40; i++) {
			adapter.addItem("item"+i);
		}
		setListAdapter(adapter);
	}

 private class MyAdapter extends BaseAdapter{

	 private LayoutInflater mInflater;
	 private ArrayList<String> mData=new ArrayList<String>();
	
	 public MyAdapter() {
		 super();
		 System.out.println("----------------------");
		
     mInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}
//此方法通過activity給view的item添加值。通過notifyDataSetChanged 刷新界面
     public  void addItem(final String item){
	   mData.add(item);
	   notifyDataSetChanged();
   }
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return mData.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		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) {
		// TODO Auto-generated method stub
		System.out.println("getview--------"+position+"--convertView--"+convertView);
		ViewHolder holder=null;
//這裏ConvertView是Android爲了優化ListView提供給我們View的緩存。當Listview加載的時候androilistview加載前10個item。隨後用緩存記住view。下次加載item時候直接讀取前10個ConvertView
		if (convertView==null) {
                    //加載前10個數據的時候用convertView獲取layout
			convertView=mInflater.inflate(R.layout.adapter, null);
			holder=new ViewHolder();
                   //通過convertView爲靜態類中的textView設置值
			holder.textView=(TextView) convertView.findViewById(R.id.adapter_text);
			convertView.setTag(holder);
                  // tag記住你現在用的是那個靜態類  但是沒搞懂爲什麼View的setTag中可以放入靜態類holder
		}else {
                  //convertView不爲空的時候取到tag
			holder=(ViewHolder) convertView.getTag();
		}
		holder.textView.setText(mData.get(position));
		
		return convertView;
	}
	 
 }
//此靜態類中用來定義了getView中準備顯示內容的控件。
 private static class ViewHolder{
	 private TextView textView;
 }
 
}
續寫。。。。。。。。。。。。。。。。
如果要實現複雜一點的adapter需要重寫baseadapter的2個方法。
(1)
@Override
public int getItemViewType(int position) {
// TODO Auto-generated method stub
return super.getItemViewType(position);
} 根據position獲取type類型
(2)@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return super.getViewTypeCount();
}
 type的個數

package bsn.cc.dd;

import java.util.ArrayList;
import java.util.TreeSet;

import android.R.integer;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class ListView extends ListActivity {
	private MyAdapter adapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		adapter = new MyAdapter();
		for (int i = 0; i < 40; i++) {
			adapter.addItem("item" + i);
			if (i!=0&&i%4==0) {
				adapter.addSplit("split-"+i);
			}
		}
		setListAdapter(adapter);
	}

	private class MyAdapter extends BaseAdapter {

		private LayoutInflater mInflater;
		private static final int TYPE_ITEM=0;
		private  static final int TYPEI_SPLIT=1;
		private static final int TYPEMAX_COUNT=TYPEI_SPLIT+1;
		private TreeSet treeSet=new TreeSet();
		private ArrayList<String> mData = new ArrayList<String>();

		public MyAdapter() {
			super();
			System.out.println("----------------------");

			mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		}

		public void addItem(final String item) {
			//將item加入arraylist中
			mData.add(item);
			notifyDataSetChanged();
		}
        public void addSplit(final String item){
        	//用treeset來保存split的位置
        	mData.add(item);
        	treeSet.add(mData.size()-1);
        	notifyDataSetChanged();
        }
        
        
		@Override
		public int getItemViewType(int position) {
			//在getview中調用通過資源的位置來確定layout。這裏用treeset來控制posotion的爲位置
			// TODO Auto-generated method stub
			return treeSet.contains(position)?TYPEI_SPLIT:TYPE_ITEM;
		}

		@Override
		public int getViewTypeCount() {
			// TODO Auto-generated method stub
			return TYPEMAX_COUNT;
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return mData.size();
		}

	

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			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) {
			// TODO Auto-generated method stub
			System.out.println("getview--------" + position + "--convertView--"
					+ convertView);
			ViewHolder holder = null;
			//根據position來獲取type,然後根據type來確定我們的adapter
			int type=getItemViewType(position);
			if (convertView == null) {
				holder = new ViewHolder();
				switch (type) {
				case TYPE_ITEM:
					convertView = mInflater.inflate(R.layout.adapter, null);
					
					holder.textView = (TextView) convertView
							.findViewById(R.id.adapter_text);
					convertView.setTag(holder);
					break;

				case TYPEI_SPLIT:
               convertView = mInflater.inflate(R.layout.adapter2, null);
					
					holder.textView = (TextView) convertView
							.findViewById(R.id.adapter_text);
					convertView.setTag(holder);
					break;
				}
				
			} else {
				holder = (ViewHolder) convertView.getTag();
				System.out.println("------------holder-----tag---"+convertView.getTag());
				System.out.println("------------holder-----是什麼??"+holder);
			}
			holder.textView.setText(mData.get(position));

			return convertView;
		}

	}

	private static class ViewHolder {
		private TextView textView;
	}

}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章