再探ListView的使用和优化

来源:互联网 发布:专业校对软件 编辑:程序博客网 时间:2024/05/21 14:57

作者在差不多一年之前的时候开始学习安卓,现在也差不多一年了,刚开始学习的时候是通过看视频,看的是老罗的视频,配的书是《安卓从入门到精通》,因为当时断断续续的,所以虽然对ListView有些了解,也知道怎么用,但是还是有些边边角角没有涉及到,这次又用到了,所以索性就把这个点全部扫一遍。

再探ListView开发

 

ListView里面最重要的就是适配器

SubAdapter(当前上下文,ListView子项布局的ID,以及要适配的数据)

 

简单的文本ListVIew

1)在一个布局文件中,拖入或者自己写一个ListView控件并设置

android:layout_width=”match_parent”

android:layout_height=”match_parent”

(这样ListView会布满整个布局空间)

(2)ListView用于展示大量数据的,但是又无法又没有办法直接传递给ListView,所以我们要借助适配器来完成。

Android本身提供了很多适配器得实现类,ArrayAdapter是最好用的一个(可以指定要适配的泛型,本身也有多个构造函数的重载)

ArrayAdapter(当前上下文,ListView子项布局的ID,以及要适配的数据)

如果是自定义的:第二个参数为自定义的子类的布局文件的XML名称

android.R.layout.simple_list_item_1 :是一个Android内置的布局文件,里面只有一个TextView,可用于简单的额显示一段文本。

定制的ListView界面

(1)定义一个实体类作为ListView适配器的适配类型(书中的是Fruit,公司的是Beacon

(2)定义子界面布局文件

(3)创建自定义的适配器(还是继承自ArrayAdapter,泛型设为上面的实体类类型)

自定义的适配器重写了

 

Public SubAdapter(Context context,int textViewReaourceID,List<T> objects)

父类的一个构造函数(上下文,ListView子项布局ID,数据)

 

@Override

public View getViewint positionView convertView, ViewGroup parent

getView()方法,这个方法在每个子项被滚动到屏幕内的时候被调用。

 

在这个方法中,我们可以通过第一个参数获取到的

Fruit fruit = getItem(position);//当前T的对象

源码:

 public T getItem(int position) {

        return mObjects.get(position);

}

 

View view = LayoutInflater.from(getContext()).inflate(resourceId, null);//动态加载XML布局文件

ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);

fruitImage.setImageResource(fruit.getImageId());

//这两句代码是获取子项的布局文件里面的控件,并且通过T取到相关的属性对其进行赋值。

 

 

 

优化ListView

病因1:自定义控件中getView()方法每次都将布局重新加载了一遍,ListView快速滚动的时候就会成为性能的瓶颈。

紧接上面:

在这个方法中,我们可以通过第二个参数获取到的

View  convertView 这个参数用于将之前加载好的布局进行缓存,以便以后重用

优化:

        View view;

if (convertView == null) {

view = LayoutInflater.from(getContext()).inflate(resourceId, null);

} else {

view = convertView;

}

病因2ViewfindViewById()方法每次都被调用

优化:

将控件的实例通过View.setTag(viewHolder)//将ViewHolder存储在View中,使用的时候通过getTag来取出

 

Tag的解释

设置与此视图关联的标签。一个标记可以用于标记其层次结构的图,并且不必须是在层次结构内是唯一的。标签也可以用来存储一个视图内的数据不诉诸另一数据结构。

ListView的子项的点击事件:

listView.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

// TODO Auto-generated method stub

}

});

/**

         * Callback method to be invoked when an item in this AdapterView has

         * been clicked.

         * <p>

         * Implementers can call getItemAtPosition(position) if they need

         * to access the data associated with the selected item.

         *

         * @param parent The AdapterView where the click happened.

         * @param view The view within the AdapterView that was clicked (this

         *            will be a view provided by the adapter)

         * @param position The position of the view in the adapter.

         * @param id The row id of the item that was clicked.

         */

void onItemClick(AdapterView<?> parent, View view, int position, long id);

 

这便是ListView每个子项的点击事件的框架,在里面可以添加你想添加的代码。



1 0
原创粉丝点击