ListView简单学习_各方资料综合心得

来源:互联网 发布:最好的java讲师 知乎 编辑:程序博客网 时间:2024/05/22 00:50

在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局。
需要配合适配器使用,选用适配器时,可以选用arrayAdapter,SimpleAdapter等,最常用baseAdapter.
ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作。也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点。读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListViewItem所覆盖。这时候最方便的方法就是使用灵活的适配器BaseAdapter了。
自定义adapter继承baseAdapter, 一般情况下步骤:
1.构造方法,用于传递context,数据源
2.public int getCount() //获得展示数据条数

3.public Object getItem(int position) //获取第position个item的内容
4.public long getItemId(int position)//获得当前item在第几行
5.public View getView(int position, View convertView, ViewGroup parent) 

getView通常最优化方案使用viewHolder+convertView使用
ViewHolder:通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能。
类似于模具,将得到的view存到缓冲view(设置标签),下次通过标签获取继续使用,不需要重复创建对象和findviewByID,占用系统资源。

convertView:重用缓存convertView传递给getView()方法来避免填充不必要的视图。

public View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stub//如此写会造成重复的构建textview,严重占用资源// resource:layout 布局文件// root:当前item的view在哪个ViewGroup中 一般返回parent// attachToRoot:需要再次将view贴在ViewGroup中吗?//convertView:之前是否有这个view,缓存的view/*View view=LayoutInflater.from(context).inflate(R.layout.base_adapter, parent, false);TextView mTextView=(TextView) view.findViewById(R.id.txt_newsItem);mTextView.setText(dataList.get(position));*///优化方案ViewHolder mHolder = null;if (convertView == null) {mHolder = new ViewHolder();convertView = LayoutInflater.from(context).inflate(R.layout.base_adapter, null);mHolder.textView = (TextView) convertView.findViewById(R.id.txt_newsItem);//将设置好的布局保存到缓存中,并将其设置在Tag里,以便后面方便取出TagconvertView.setTag(mHolder);} else {mHolder = (ViewHolder) convertView.getTag();}mHolder.textView.setText(dataList.get(position));return convertView;}class ViewHolder {TextView textView;}


模具里加入需要显示的控件如textview.imageview等,然后将模具加载到convertView上, 也就是每一条item

当我们判断 convertView == null  的时候,如果为空,就会根据设计好的List的Item布局(XML),来为convertView赋值,并生成一个viewHolder来绑定converView里面的各个View控件(XML布局里面的那些控件)。再用convertView的setTag将viewHolder设置到Tag中,绑定convertView,以便系统第二次绘制ListView时从Tag中取出。

如果convertView不为空的时候,就会直接用convertView的getTag(),来获得一个ViewHolder。


1 0
原创粉丝点击