安卓基础之ListView

来源:互联网 发布:淘宝电子面单打印教程 编辑:程序博客网 时间:2024/06/05 16:42

ListView

特点:1、屏幕一次性能显示多少就只能一次性初始化多少,节约内存;2、可以通过convertView来复用创建的对象视图,保持创建的对象是一定的;3、ListView 自带ScrollView 的功能,可以实现界面滚动4、ListView 控件的设计遵循MVC 设计模式

入门案例

1、布局控件:RelativeLayout
2、查找控件,设置控制器。这里可以实现接口或者继承类,因为接口里的方法太多,所以我们一般使用继承类,继承BaseAdapter里面有四种方法。

  • getCount() 控制listview里面有多少个item
  • getView(int position, View convertView, ViewGroup parent) 返回某个位置显示的view对象。
  • getItem(int position) 获取item的对象
  • getItemId(int position) 获取item的id

优化

上诉的步骤只是最简单的显示出来了一个listview以及里面展示的数据,但是如果我们要显示的数据有一万条,那么在快速往上滚动的过程中就会不断的调用adapter中的getView方法,不断的生成新的Textview控件,消耗内存资源,最后导致内存不足,造成oom内存溢出。

ListView复用的原理

当我们滑动listview的时候,每当一个item看不见的时候,那么那个item就可以被复用起来了,也就是成为了convertView,那个时候convertView就不为null了所谓的复用,其实本质是就是item的view对象没有真正的被垃圾回收器回收掉,而是重新将身上的数据给换掉了,看起来好像是出现了一个新的item而已

对ListView 进行优化的最简单有效的措施就是复用getView 方法中的convertView 对象。

优化后的代码:

public View getView(int position, View convertView, ViewGroup parent) {TextView tv = null;if (null == convertView) {    //如果缓存中没有数据则需要创建一个新的TextView    tv = new TextView(MainActivity.this);}else{    //如果缓存中有数据则直接强转即可    tv = (TextView) convertView;    }    tv.setText("我是文本:" + position);    tv.setTextSize(24);    return tv;}   

打气筒 inflate

当我们listview的item条目需要显示比较复杂的布局时,这个时候如果还用代码的方式去实现就不是很方便了,所以android给我们提供了一个方便的API,View对象本身或者任何继承View对象的控件都有一个方法我们把它形象的比喻为打气筒,可以将一个布局文件打气打成一个View对象,方便我们使用。布局里面的所有控件都可以通过这个View对象来进行查找

有三种方式将一个布局文件转化为Veiw对象

1系统控件View自带有inflate方法    view = View.inflate(MainActivity.this, R.layout.item, null);2获取LayoutInflater 对象,然后调用inflate 方法    LayoutInflater layoutInflater = LayoutInflater.from(MainActivity.this);    view = layoutInflater.inflate(R.layout.item, null);3先通过上下文提供的getSystemService 方法获取LayoutInfater 对象。然后调用inflate 方法LayoutInflater layoutInflater2 = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);    view = layoutInflater2.inflate(R.layout.item, null);

ListView 的常见适配器

  • ArrayAdapter
    • lv.setAdapter(new ArrayAdapter< T >(context, resource, objects));
    • context上下文 resource布局文件的id objects要显示的数据,使用list集合或者数组都行
  • SimpleAdapter
    • impleAdapter 可以实现比ArrayAdapter 复杂一点的布局。使用SimpleAdapter 的数据一般都是HashMap构成的List,List 的每一个对象对应ListView 的每一行。HashMap 的每个键值数据映射到布局文件中对应id 的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局文件。

对话框

对话框的初始化

AlertDialog.Builder builder = new Builder(当前Activity的上下文);

对话框设置属性

builder.setTitle(title);-->设置标题builder.setMessage(msg);-->设置提醒信息

设置对话框按钮

builder.setPositiveButton(按钮文字,new DialogInterface.OnClickListener());-->最右边的按钮builder.setNegativeButton(按钮文字,new DialogInterface.OnClickListener());-->最左边的按钮builder.setNeutralButton(按钮文字,new DialogInterface.OnClickListener());-->中间的按钮

对话框显示

builder.show();

对话框样式

setSingleChoiceItems()-->单选setMultiChoiceItems()-->多选ProgressDialog -->进度条

Android下的帧动画

帧动画:就是由一张一张的图片按照顺序和时间进行一帧一帧的播放。帧动画使用的步骤:1.创建帧动画每帧需要的图片, 放到对应的 drawable-xxx 或drawable 目录中2.在drawable 目录下,创建帧动画 xml 文件,根节点选择 animation-list帧动画的自动执行:oneshot  如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放。3.  设置为 View 的 Background 或者 ImageView 的 src,然后获取到控件的 AnimationDrawable 对象,通过 AnimationDrawable.start() 方法启动动画:ImageView iv = (ImageView) findViewById(R.id.iv);iv.setBackgroundResource(R.drawable.logo);AnimationDrawable anim = (AnimationDrawable) iv.getBackground();anim.start();//开始播放动画

Android国际化

文字国际化

在res文件下创建values--xx文件夹,在里面创建strings.xml文件,在里面写对应的语言

图片国际化

drawable-xxx里面的资源名字要起一样的,这样系统就能根据当前的语言自动去寻找对应的文件夹资源

样式和主题

配置样式:

在style文件里设置,如果想继承系统自带的主题或者样式,指定 parent=“需要继承的样式”;如果需要修改继承样式里的某一样,在自定义样式里面重写需要修改的属性即可。目的是为了达到复用,代码的简洁,统一修改的便捷。

设置主题:

可以通过设置theme属性参数来修改整个应用程序或者单个界面的主题风格:在清单文件里面配置 theme="@style:..."指定style为AppTheme则整个应用程序的主题风格即为AppTheme的风格,当然也可以修改AppTheme的风格,将当前主题添加一个没有标题栏的风格,或者自己定义一个theme;也可以在代码中设置主题,在代码设置 setTheme(ResId) 此方法必须在setContentView之前调用。
0 0