ListView的使用2
来源:互联网 发布:编程解决鸡兔同笼 编辑:程序博客网 时间:2024/06/09 13:38
之所以说 ListView这个控件很难用,就是因为它有很多的细节可以优化,其中运行效率就是很重要的一点。目前我们ListView的运行效率是很低的,因为在 FruitAdapter的getView()方法中每次都将布局重新加载了一遍,当 ListView快速滚动的时候这就会成为性能的瓶颈。
提升 ListView 的运行效率
getView()方法中还有一个 convertView 参数,这个参数用于将之前加载好的布局进行缓存,以便之后可以进行重用。修改 FruitAdapter中的代码,如下所示:
@Overridepublic View getView(int position, View convertView, ViewGroup parent){ Fruit fruit = getItem(position); View view; if (convertView == null){ view = LayoutInflater.from(getContext()).inflate(resourceId,null); } else { view = convertView; } ImageView fruitView = (ImageView) view.findViewById(R.id.fruit_image); TextView fruitName = (TextView) view.findViewById(R.id.fruit_name); fruitView.setImageResource(fruit.getImageId()); fruitName.setText(fruit.getName()); return view;}
现在我们在 getView()方法中进行了判断,如果 convertView 为空,则使用LayoutInflater 去加载布局,如果不为空则直接对 convertView进行重用。这样就大大提高了ListView的运行效率,在快速滚动的时候也可以表现出更好的性能。
目前我们的这份代码还是可以继续优化的,虽然现在已经不会再重复去加载布局,但是每次在getView()方法中还是会调用View的findViewById()方法来获取一次控件的实例。我们可以借助一个 ViewHolder来对这部分性能进行优化,修改 FruitAdapter 中的代码,如下所示:
@Overridepublic 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); } else { view = convertView; viewHolder = (ViewHolder) view.getTag(); } viewHolder.fruitImage.setImageResource(fruit.getImageId()); viewHolder.fruitName.setText(fruit.getName()); return view;}class ViewHolder{ ImageView fruitImage; TextView fruitName;}
我们新增了一个内部类 ViewHolder,用于对控件的实例进行缓存。当 convertView为空的时候,创建一个 ViewHolder对象,并将控件的实例都存放在 ViewHolder 里,然后调用 View的 setTag()方法,将 ViewHolder 对象存储在 View 中。当 convertView 不为空的时候则调用View的 getTag()方法,把 ViewHolder 重新取出。这样所有控件的实例都缓存在了 ViewHolder里,就没有必要每次都通过 findViewById()方法来获取控件实例了。
ListView 的点击事件
修改 MainActivity 中的代码,如下所示:
@Overrideprotected 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); listView.setOnItemClickListener(new AdapterView.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(); } });}
我们使用了 setOnItemClickListener()方法来为 ListView 注册了一个监听器,当用户点击了 ListView中的任何一个子项时就会回调 onItemClick()方法,在这个方法中可以通过 position 参数判断出用户点击的是哪一个子项,然后获取到相应的水果,并通过 Toast将水果的名字显示出来。
by web开发者 更多相关内容请访问: http://weber.pub/
本文地址: http://weber.pub/安卓笔记13-listview的使用2/310.html
- ListView的使用2
- ListView的使用2
- ListView控件的使用2
- listview 的使用
- ListView的使用
- ListView的使用技巧
- delphi ListView 的使用
- ListView的使用
- EasyMF ListView 的使用
- ListView的使用
- listview的使用1
- ListView的使用
- ListView控件的使用
- ListView的使用
- Listview 的基本使用
- ListView的使用1
- android ListView的使用
- listView的使用
- Java 集合框架
- try/catch中有return语句finally是否被执行,什么时候执行?
- ubuntu14.04安装ambari
- BZOJ 3224 普通平衡树
- 安卓底层开发学习经验第十三期
- ListView的使用2
- WEB打印的几种方案
- 最近配置caffe 配置吐了
- Duilib中RichEdit控件获取EN_CHANGE消息
- Android 心跳连接功能 bindService()无法启动Service的问题
- 1006. 换个格式输出整数 (15)
- android data binding实践之:ViewDataBinding
- mysql 函数与存储过程及区别
- ReactiveCocoa 中 RACSignal 所有变换操作底层实现分析(上)