`
lversam
  • 浏览: 116735 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类

[转]android adapter 深刻分析

阅读更多

转帖地址,不知源头,留个脚印。

http://www.devdiv.com/blog/space-1-do-blog-id-1397.html

 

 

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 );   
        }   
}  

分享到:
评论

相关推荐

    Android:DatePacker日期选择教学

    在实现上述功能时,我们需要对Android的生命周期有深刻理解,确保在适当的时候初始化和销毁这些组件,防止内存泄漏。此外,考虑到应用程序的国际化,我们还需要处理日期格式和语言偏好,以适应全球用户。 文件名为...

    Android程序研发源码高仿基于android2.2(Froyo)的Contacts.zip

    在Android程序开发中,源码高仿是一种常见的学习方法,通过分析系统自带应用的源代码,开发者可以深入...通过深入学习和分析这份源码,开发者不仅可以提升自己的编程技能,还能对Android系统的整体运作有更深刻的理解。

    安卓Android源码——简单的海贼王连连看源码.zip

    《安卓Android源码——简单的海贼王连连看源码》是一个专门为Android平台设计的游戏源代码,它基于流行的海贼...通过深入研究和实践这个源码,开发者不仅可以提升Android开发技能,还能对游戏开发流程有更深刻的理解。

    Android 记账本源码.zip

    在Android开发领域,一款记账本应用的源码可以为我们提供深入学习和实践移动应用开发的宝贵资源。...通过实际操作和修改源码,开发者可以更深刻地理解Android应用的工作原理,提高自己的编程能力。

    AndroidTXT 文本阅读器源码.zip

    《Android TXT文本阅读器源码解析》 在移动设备领域,Android系统因其开源特性与强大的开发者社区支持,成为了...通过实际操作和代码解析,开发者可以更深刻地理解Android应用的工作原理,从而提高自己的编程技巧。

    android源码汇编

    通过深入学习这些源码,开发者不仅可以提高编程能力,还能对Android系统的运作机制有更深刻的理解,从而更好地优化应用性能,解决实际问题。这份"Android源码汇编"无疑为Android开发者提供了丰富的学习素材。

    Android 超炫的图片浏览器.zip

    3. **布局管理**:图片浏览器可能包含网格视图和全屏视图等多种布局,这需要对Android的布局系统有深刻理解,如GridView、LinearLayout、RelativeLayout等,以及如何通过RecyclerView进行高效的数据绑定和滚动优化。...

    Android应用源码之口袋微博 服务器 客户端代码-IT计算机-毕业设计.zip

    这篇文档将深入解析《Android应用源码之口袋微博 服务器 客户端代码》这个项目,它是针对IT计算机专业...通过深入研究和学习这份源码,学生可以全面提高自己的Android开发技能,并对移动应用的全栈开发有更深刻的理解。

    android仿开心网源代码.zip

    总之,这份"android仿开心网源代码.zip"为Android开发者提供了一个实践和学习社交应用开发的实例,通过深入学习和理解,开发者可以提升自己的Android应用开发技能,对移动社交应用的设计和实现有更深刻的认识。

    Android优化大师源代码.rar

    3.2 RecyclerView优化:包括Adapter的DiffUtil使用,ViewHolder复用,以及预加载策略等,确保列表滚动平滑。 3.3 图片加载与压缩:可能采用了 Glide、Picasso 或 Fresco 图片加载库,进行图片缓存和按需加载,同时...

    Android eoe社区客户端-IT计算机-毕业设计.zip

    《Android eoe社区客户端:深度解析与学习指南》 Android eoe社区客户端是针对学生毕业设计的一款源码...通过深入学习和实践,开发者不仅可以掌握Android开发的基本技能,还能对软件架构和设计原则有更深刻的理解。

    android SectorMenuView底部导航扇形菜单的实现代码

    这次分析一个扇形菜单展开的自定义View, 也是我实习期间做的一个印象比较深刻的自定义View, 前后切换了很多种实现思路, 先看看效果展示 效果展示 效果分析 点击圆形的FloatActionBar, 自身旋转一定的角度 菜单像...

    PullOver:android中的图像查看器应用程序

    总结,PullOver作为Android平台的一款图像查看器应用,其成功在于对用户体验的深刻理解以及对性能优化的不懈追求。通过对PullOver的深入剖析,开发者不仅能提升自身技能,还能为自己的项目带来新的灵感和解决方案。

    listView中Editext错乱

    4. 使用Adapter的setNotifyOnChange()方法:默认情况下,ListView会在数据集发生改变时自动刷新,但我们也可以手动调用setNotifyOnChange(false)来关闭这个功能,然后在需要时手动调用notifyDataSetChanged()。...

    flipboard.rar

    Flipboard的翻页动画令人印象深刻,这需要深入理解Android的`Property Animation`系统和`View Animation`。源码中可能包含自定义动画和过渡效果的实现,这些都是提升应用视觉吸引力的关键。 7. **权限管理与隐私...

    RecyclerView-Animation-Demo:RecyclerView-动画

    CircularReveal以圆形的方式揭示或隐藏视图,这种效果通常会给人留下深刻的印象,增强应用的视觉吸引力。 项目中可能涉及的具体知识点包括: - RecyclerView的基本使用:设置Adapter、LayoutManager、...

Global site tag (gtag.js) - Google Analytics