android adapter 深刻分析

来源:互联网 发布:大数据可视化工具三维 编辑:程序博客网 时间:2024/05/21 19:29
我在刚玩android 时候,对这个adapter很不理解,到底是什么原理呢? 适配器,哎,只知道setAdapter()把参数传进去,系统就显示出来了。

今天,针对这个东西,我们做个系统详细的分析.

listview加载adapter过程是这样的.

1 先判断adapter 有多少数据项,根据这个数据确定有多少item. 
2 确定每个item里加载哪个View. 
3 把View里加载要显示的数据.

问提一个一个来解决. 第一个问题: 因为adapter都要关联一个list .有来存储数据.list的项数就是Item的数目. 我们在重载BaseAdapter 时候,都要实现这个函数

public int getCount() { 
return weatherList.size(); 


哎,这个函数就是确定关联条目的.

第二个问题 哪来的view 呢, 当然我们自己创建的.重载BaseAdapter时候你要实现getView()这个函数,就是这个view.

第三个问题,你自己创建的view.加载哪些数据你该知道的.呵呵.

张豪就喜欢看例子,这个小伙子技术,管理都很牛,得以他为榜样. 得努力.

public class CustomAdapterActivity extends ListActivity 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 

super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
ArrayList<Weather> weatherList = new ArrayList<Weather>(); 
Weather w = new Weather( "London", 17, Weather.OVERCAST ); 
weatherList.add( w ); 
w = new Weather( "Paris", 22, Weather.OVERCAST ); 
weatherList.add( w ); 
w = new Weather( "Athens", 29, Weather.SUNNY ); 
weatherList.add( w ); 
w = new Weather( "Stockholm", 12, Weather.RAIN ); 
weatherList.add( w ); 
WeatherAdapter weatherAdapter = new WeatherAdapter( 
this, 
weatherList ); 
setListAdapter( weatherAdapter ); 



哎,这个大家都很清楚,关键问题是weatherAdapter 哪来的呢? 自己创建的啊,如果创建呢?

public class WeatherAdapter extends BaseAdapter { 

private Context context; 
private List<Weather> weatherList;  这就是adapter关联的List,用来存储数据.还记的ArrayList 要往里传参数吗? 传的也是这个类型啊.呵呵

public WeatherAdapter(Context context, List<Weather> weatherList ) { 
this.context = context; 
this.weatherList = weatherList; 


public int getCount() { 
return weatherList.size(); 


public Object getItem(int position) { 
return weatherList.get(position); 


public long getItemId(int position) { 
return position; 


public View getView(int position, View convertView, ViewGroup parent) { 
Weather weather = weatherList.get(position); 
return new WeatherAdapterView(this.context, weather ); 




哎,这段告诉了我们,有多少个Item, 可以通过getCount()得到了。 可是View 哪来的呢?
当然是getView ()这个函数提供.

这个view 的获取就多中多样了,我们可以传个LayoutID. 通过Inflater出来,也可以自己创建个,只要出来就行.

在这里,我们自己创建个View. 这个View.是个VIewGroup.


class WeatherAdapterView extends LinearLayout { 
public static final String LOG_TAG = "WeatherAdapterView"; 

public WeatherAdapterView(Context context, 
Weather weather ) { 
super( context ); 

this.setOrientation(HORIZONTAL); 
LinearLayout.LayoutParams cityParams = 
new LinearLayout.LayoutParams(100, LayoutParams.WRAP_CONTENT); 
cityParams.setMargins(1, 1, 1, 1); 

TextView cityControl = new TextView( context ); 
cityControl.setText( weather.getCity() ); 
addView( cityControl, cityParams); 

LinearLayout.LayoutParams temperatureParams = 
new LinearLayout.LayoutParams(20, LayoutParams.WRAP_CONTENT); 
temperatureParams.setMargins(1, 1, 1, 1); 

TextView temperatureControl = new TextView(context); 
temperatureControl.setText( Integer.toString( weather.temperature ) ); 
addView( temperatureControl, temperatureParams); 

LinearLayout.LayoutParams skyParams = 
new LinearLayout.LayoutParams(25, LayoutParams.WRAP_CONTENT); 

ImageView skyControl = new ImageView( context ); 
Log.d( LOG_TAG, weather.getCity()+" -> "+weather.sky ); 
skyControl.setImageResource( weather.getSkyResource() ); 
addView( skyControl, skyParams ); 



有了这个就很清楚了. 呵呵,很明白吧, 一定得深入,细致的理解
原创粉丝点击