[置顶] Adapter详解



动态添加数据适配器adapter

Adapter是适配器,许多UI组件需要搭配Adapter来显示界面,例如Spinner与ListView,另外当我们需要动态的添加数据给UI组件时就需要Adapter了。

我们来介绍几个常见的Adapter:


ArrayAdapter<T>(comman)
SimpleAdapter extends Baseadapter(comman)
******************************************************************************

这两个适配器非常常见,也非常有用,通常传输的数据可以是ArrayList<>封装的数据。

示例如下:ArrayAdapter

private String[] string={"china","america","japan"};
List list=new ArrayList<String>();
for(int i=0;i<string.length;i++)
{
list.add(string[i]);
}
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.simple_spinner_item,list);

首先我们定义封装数据,然后再定义Adapter,最后调用setAdapter()方法。

 

ArrayAdapter有三个参数,第一个参数为Activity.this,第三个参数为动态添加给adapter的数据
对于第二个数据:
R.layout.simple_spinner_item:意思是将数据传给一个简单地TextView组件

示例:SimpleAdapter

 

public class SimpleAdapter extends Activity{
private String[] names =new String[]{"nick","lebron","kobe","kevin"};
private int[] imgsIds[] =new Int[] {R.drawable.1,R.drawable.2,R.drawable.3,R.drawable.4};
@Override
public void onCreate(Bundle savedInsatnceState)
{
super.onCreate(savedInsatnceState);
setTitle("simpleadapter");
setContentView(R.layout.main);
List<Map><String,Object> list=new ArrayList<Map><String,Object>();//创建动态数组ArrayList
for(int i=0;i<names.length;i++){
Map<String,Object> map=new HashMap=<String,Object>;
map.put("name",names[i]);
map.put("headerImg",imgsIds[i]);
list.add(map);
}
SimpleAdapter adapter=new SimpleAdaper(this,list,R.layout.main,new String[]{"name","headerImg"},new int[]{R.id.name,R.id.headerImg});
ListView list=(ListView)findViewById(R.id.mylist);
list.setAdaper(adapter);
}
}


 


接下来我们介绍另一个常用的Adapter:BaseAdapter
BaseAdapter implements SpinnerAdapter implements ListViewAdapter(可用于ListView和Spinner)

示例:

 

public MyListView extensds Activity{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInsatnceState);
mDate=getDate();
MyAdapter myadapter=new MyAdapter(this);
ListView list=(ListView)findById(R.id.myList);
setAdapter(myadapter);
}
 private List<Map<String, Object>> getData() {
            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("title", "G1");
            map.put("info", "google 1");
            map.put("img", R.drawable.i1);
            list.add(map);
     //添加第二个Map数据
            map = new HashMap<String, Object>();
            map.put("title", "G2");
            map.put("info", "google 2");
            map.put("img", R.drawable.i2);
            list.add(map);
     //添加第三个Map数据
            map = new HashMap<String, Object>();
            map.put("title", "G3");
            map.put("info", "google 3");
            map.put("img", R.drawable.i3);
       	    list.add(map);
	    return list; //返回List数据
	}
@verride
protected void onListItemClicked(ListView 1,View v,int position,long id){
Log.v("MyListView4_click",(String)mData.get(position).get("title"));
	}
public void showInfo(){
	new AlertDiolog.Builder(this)
	.setTitle("MyListView")
	.setMessage(Introduce)
	.setPositiveButton("Ensure",new DialogInterface.OnClickListener()
	{@Override
	public void onClick(DialogInterface dialog,int which){}	}).show();
	}
}
private final class ViewHolder{
public ImageView img;
public TextView title;
public TextView info;
public Button viewBu;	
}
public class MyAdapter extens BaseAdapter{
private LayoutInlfater myInflater;
public MyAdapter(Context context){
this.myInflater=LayoutInflater.from(context);
}
@Override
public int getCount(){
	return mDate.size();}
@Override
public long getItemId(int position){
	return null;}
@Override 
public Object getItmeId(int position){
	return 0;}
@Override 
public View getview(int position,View convertView,ViewGroup parent){
ViewHolder holder=null;
if(convertView==null){
holder=new ViewHolder();
convertView=mInflater.inflate(R.layout.list,null)
//inflate函数有两个参数--解析界面布局
holder.img=(ImageView)convertView.findViewById(R.id.img);
holder.title=(TextView)convertView.findViewById(R.id.title);
holder.info=(TextView)convertView.findViewById(R.id.info);
holder.viewBu=(TextView)convertView.indViewById(R.id.viewBu);
convertView.setTag(holder);
	}else{holder=(ViewHolder)convertViewgetTag();}
holder.img.setBackgroundResounce((Integer)mDate.get(position).get("img"));
holder.title.setText((String)mdata.get(position).get("title"));
holder.info.setText((String)mData.get(position).get("info"));
holder.viewBu.setOnClickListener(new View.OnClickListener(){
	@Override
	public void onClick(View v){
	showInfo();	}	
	});

return convertView;
}
}
}


getView()方法有三个参数,int position表示第几行,第几个Item;convertView 表示解析过来的布局,getCount表示列表项的个数。

 


在使用ExpandabListView组件时,我们必须使用这个Adapter:

ExpandableAdapter:(用于ExpandableListView):

 

public class ExpandableListViewTest extends Activity
{
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		//创建一个BaseExpandableListAdapter对象
		ExpandableListAdapter adapter = new BaseExpandableListAdapter()
		{
			int[] logos = new int[]
			{
				R.drawable.p,
				R.drawable.z,
				R.drawable.t
			};
 			private String[] armTypes = new String[]
				{ "神族兵种", "虫族兵种", "人族兵种"};
			private String[][] arms = new String[][]
			{
				{ "狂战士", "龙骑士", "黑暗圣堂", "电兵" },
				{ "小狗", "刺蛇", "飞龙", "自爆飞机" },
				{ "机枪兵", "护士MM" , "幽灵" }
			};
			//获取指定组位置、指定子列表项处的子列表项数据
			@Override
			public Object getChild(int groupPosition, int childPosition)
			{
				return arms[groupPosition][childPosition];
			}
			@Override
			public long getChildId(int groupPosition, int childPosition)
			{
				return childPosition;
			}
			@Override
			public int getChildrenCount(int groupPosition)
			{
				return arms[groupPosition].length;
			}
			private TextView getTextView()
			{
				AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
						ViewGroup.LayoutParams.FILL_PARENT, 64);
				TextView textView = new TextView(ExpandableListViewTest.this);
				textView.setLayoutParams(lp);
				textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
				textView.setPadding(36, 0, 0, 0);
				textView.setTextSize(20);
				return textView;
			}
			//该方法决定每个子选项的外观
			@Override
			public View getChildView(int groupPosition, int childPosition,
					boolean isLastChild, View convertView, ViewGroup parent)
			{
				TextView textView = getTextView();			
				textView.setText(getChild(groupPosition, childPosition).toString());
				return textView;
			}
			//获取指定组位置处的组数据
			@Override
			public Object getGroup(int groupPosition)
			{
				return armTypes[groupPosition];
			}
			@Override
			public int getGroupCount()
			{
				return armTypes.length;
			}
			@Override
			public long getGroupId(int groupPosition)
			{
				return groupPosition;
			}
			//该方法决定每个组选项的外观
			@Override
			public View getGroupView(int groupPosition, boolean isExpanded,
					View convertView, ViewGroup parent)
			{
				LinearLayout ll = new LinearLayout(ExpandableListViewTest.this);
				ll.setOrientation(0);
				ImageView logo = new ImageView(ExpandableListViewTest.this);
				logo.setImageResource(logos[groupPosition]);
				ll.addView(logo);
				TextView textView = getTextView();
				textView.setText(getGroup(groupPosition).toString());				
				ll.addView(textView);			
				return ll;
			}
			@Override
			public boolean isChildSelectable(int groupPosition, int childPosition)
			{
				return true;
			}
			@Override
			public boolean hasStableIds()
			{
				return true;
			}
		};
		ExpandableListView expandListView = (ExpandableListView)
			findViewById(R.id.list);
		expandListView.setAdapter(adapter);
	}
}

 


还有一些Adapter,例如:

SimpleCursorAdapter(用于来自数据库的数据)

关键代码如下:
Cursor cur = getContentResolver().query(People.CONTENT_URI, null, null, null, null);
         startManagingCursor(cur);
//来自系统通讯录数据库的Cursor数据
ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cur, new String[] {People.NAME}, new int[] {android.R.id.text1});
         setListAdapter(adapter);

 

posted @ 2013-07-01 19:56  坚固66  阅读(384)  评论(0编辑  收藏  举报