ListView使用及性能优化
2015-10-31 09:33
465 查看
一、ListView是Android中使用最广泛的一类控件,首先介绍其基本使用:
1、布局文件activity_main.xml中添加一个ListView组件
2、主活动MainActivity中操作ListView,创建并设置适配器adapter,泛型类型为数据类型,形参为上下文context、列表项布局、列表数据(此处列表数据为数组类型)
以上式ListView的简单用法,显示列表项为字符串
二、下面自定义列表项,实现复杂界面
1、自定义列表项布局fruit_item.xml文件,显示一个图片和一个文本
2、定义列表项类--即适配器的适配类型
3、以下步骤为关键点,创建一个自定义的适配器FruitAdapter,继承自ArrayAdapter,并将泛型--即适配器的适配类型指定为fruit 类
4、主活动中操作,此时数据格式为列表类型,注意数据列表一定要初始化。
5、为列表项添加点击事件
三、性能优化:主活动中,getView()方法每次都会将布局重新加载一遍,使得ListView在快速滑动时产生瓶颈,并且要调用View 的findViewById()方法来获取一次控件的实例。现在使用getView()方法的convertView参数缓存布局,新建ViewHolder类缓存控件的实例以优化性能
1、布局文件activity_main.xml中添加一个ListView组件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView> </LinearLayout>
2、主活动MainActivity中操作ListView,创建并设置适配器adapter,泛型类型为数据类型,形参为上下文context、列表项布局、列表数据(此处列表数据为数组类型)
public class MainActivity extends Activity { private String[] data = { "Apple", "Banana", "Orange", "Watermelon", "Pear", "Grape", "Pineapple", "Strawberry", "Cherry", "Mango" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayAdapter<String> adapter = new ArrayAdapter<String>( MainActivity.this, android.R.layout.simple_list_item_1, data); ListView listView = (ListView) findViewById(R.id.list_view); listView.setAdapter(adapter); } }
以上式ListView的简单用法,显示列表项为字符串
二、下面自定义列表项,实现复杂界面
1、自定义列表项布局fruit_item.xml文件,显示一个图片和一个文本
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/fruit_image" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/fruit_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="10dip" /> </LinearLayout>
2、定义列表项类--即适配器的适配类型
public class Fruit { private String name; private int imageId; public Fruit(String name, int imageId) { this.name = name; this.imageId = imageId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getImageId() { return imageId; } public void setImageId(int imageId) { this.imageId = imageId; } }
3、以下步骤为关键点,创建一个自定义的适配器FruitAdapter,继承自ArrayAdapter,并将泛型--即适配器的适配类型指定为fruit 类
public class FruitAdapter extends ArrayAdapter<Fruit> { private int resourceId; public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects) { super(context, textViewResourceId, objects); resourceId = textViewResourceId; } @Override //getView()方法在子项被滚动到屏幕的时候会被调用 public View getView(int position, View convertView, ViewGroup parent) { Fruit fruit = getItem(position); // 获取当前项的Fruit实例 View view = LayoutInflater.from(getContext()).inflate(resourceId, null); ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image); TextView fruitName = (TextView) view.findViewById(R.id.fruit_name); fruitImage.setImageResource(fruit.getImageId()); fruitName.setText(fruit.getName()); return view; } }
4、主活动中操作,此时数据格式为列表类型,注意数据列表一定要初始化。
public class MainActivity extends Activity { private List<Fruit> fruitList = new ArrayList<Fruit>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initFruits(); // 初始化水果数据 FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList); ListView listView = (ListView) findViewById(R.id.list_view); listView.setAdapter(adapter); } private void initFruits() { Fruit apple = new Fruit("Apple", R.drawable.apple); fruitList.add(apple); Fruit banana = new Fruit("Banana", R.drawable.banana); fruitList.add(banana); Fruit caomei = new Fruit("caomei", R.drawable.caomei); fruitList.add(caomei); Fruit chengzi = new Fruit("chengzi", R.drawable.chengzi); fruitList.add(chengzi); Fruit fanqie = new Fruit("fanqie", R.drawable.fanqie); fruitList.add(fanqie); Fruit li = new Fruit("li", R.drawable.li); fruitList.add(li); Fruit lizi = new Fruit("lizi", R.drawable.lizi); fruitList.add(lizi); Fruit mangguo = new Fruit("mangguo", R.drawable.mangguo); fruitList.add(mangguo); Fruit mihoutao = new Fruit("mihoutao", R.drawable.mihoutao); fruitList.add(mihoutao); Fruit orange = new Fruit("orange", R.drawable.orange); fruitList.add(orange); Fruit xinzi = new Fruit("xinzi", R.drawable.xinzi); fruitList.add(xinzi); Fruit yintao = new Fruit("yintao", R.drawable.yintao); fruitList.add(yintao); } }
5、为列表项添加点击事件
....... listView.setAdapter(adapter); //设置列表项点击事件 listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Fruit fruit = fruitList.get(position); Toast.makeText(MainActivity.this, fruit.getName(), Toast.LENGTH_SHORT).show(); } }); ......
三、性能优化:主活动中,getView()方法每次都会将布局重新加载一遍,使得ListView在快速滑动时产生瓶颈,并且要调用View 的findViewById()方法来获取一次控件的实例。现在使用getView()方法的convertView参数缓存布局,新建ViewHolder类缓存控件的实例以优化性能
public class FruitAdapter extends ArrayAdapter<Fruit> { private int resourceId; public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects) { super(context, textViewResourceId, objects); resourceId = textViewResourceId; } @Override // 在子项被滚动到屏幕的时候会被调用 public View getView(int position, View convertView, ViewGroup parent) { Fruit fruit = getItem(position); View view; ViewHolder viewHolder; if (convertView == null) { view = LayoutInflater.from(getContext()).inflate(resourceId, null); viewHolder = new ViewHolder(); viewHolder.fruitImage = (ImageView) view .findViewById(R.id.fruit_image); viewHolder.fruitName = (TextView) view .findViewById(R.id.fruit_name); view.setTag(viewHolder); // 将ViewHolder存储在View中 } else { view = convertView; viewHolder = (ViewHolder) view.getTag(); // 重新获取ViewHolder } viewHolder.fruitImage.setImageResource(fruit.getImageId()); viewHolder.fruitName.setText(fruit.getName()); return view; } class ViewHolder { ImageView fruitImage; TextView fruitName; } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories