关于ListView

讨论这个话提前,我认为你已经对ListView熟悉了。

术语:

index :子视图的索引

position:数据在Adapter中的位置

id:数据唯一的标识

Stable IDs:

hasStableIds() == true 表示你的ID对应着唯一的数据,这就是所谓的稳定,Id与数据源的一致。

关于Adapters:
getView方法是对整个数据展现的控制,经常我们要对其进行优化。

关于回收视图,ViewHolder模式相信大家都很熟悉了,谨记。

Some rules:

1.不要缓存View。

2.不要试图通过Adapter访问View

3.不要改变convertView的结构

4.不要猜想getView被调用了

关于处理数据的改变:

数据更新:使用notifyDataSetChanged方法,刷新局部视图。

当不再有可用的数据了:使用notifyDataSetInvalidated(),调用该方法表示不再继续监听数据源,即便数据源后面有改变,也就是当前长什么样子,就维持这个状态了。

(不过这方法貌似很少用,大家有意见可以发表)

当你想一个列表中有不同的视图布局的时候:

getItemViewType

-给定位置的View类型

-用来提供正确的convertView

getViewTypeCount

-多少个类型是你所期望的

条目属性:

如何使Item enable或者disable?

通过重写boolean isEnabled(int position)

enable:表示item可以被选择和点击。 反之disable则不然。

 

Choice Mode: 单选模式

Multichoice Mode:多选模式

通过myListView.setChoiceMode,但是这种还是有点限制的,你所使用的Layout必须是android.R.layout.simple_list_item_single_choice或者之类的,SDK自带的那种布局。

如何知道哪个被选中了?

-单选模式

getCheckedItemPosition

-多选模式

getCheckedItemPostions

如果你有前面提到的stableIDS,maybe你可以:

getCheckedItemIds

image

 

关于Item的焦点问题

myListView.setItemsCanFocus 设置item是否可以获得焦点,默认显然可以的。

那么list items将整个作为一个焦点么? 不对的。

在每个Item中的view可以有焦点的么? 答案是肯定的

这里聊一个经常遇到的问题,比如一个Item中有一个button,这个Button会获取这个Item的焦点,你可能点item没有以前那种效果了,这个时候你可能需要将button的focusable设置为false。

 

Header和footer:listview的头和脚(当前视图)

你可能写过这样的代码:

image

通过布局弄出一个头来。

但是呢,这种方式,头是不会随着ListView滚动的。

so,怎么做呢?

ListView.addHeadView

ListView.addFooterView

注意!!!

必须在setAdater前调用。

还有就是:

image

 

android:listSelector 可以修改默认的 item获取焦点或者被点击后的效果

比如:

image

如果你的Item是不透明的,你可以设置convertView.setBackgroundResource(R.drawable.selector);

image

 

其它特征:

android:transcriptMode

注意:当List内容发生改变的时候才会触发

-disable 效果是不会滚动

-normal 滚动到底部

-alwaysScroll 总是滚动到底部

android:stackFromBottom

这个如果写过短信之类的程序,会很熟悉。 item栈会倒着来。以最后一个item为开头。

image

 

Text Filter: 文本过滤器

-android:textFilterEnabled=”true”

-adapter必须实现filterable接口

-比如CursorAdapter和ArrayAdapter

-实现getFilter

实现Filter:

image

 

下面是些注意事项:

你的List可能滑动是变黑?

答:android:cacheColorHint=”#00000000”

你的滚动条大小发生改变?

-如果你的item 有不同的高度

-而smoothScrollbar 需要精确计算每个item的高度

-这么做太昂贵了:也就是说如果Item有不同的高度,还是将android:smoothScrollbar设置为false.

你所不要做的事:

不要试图将listView的android:layout_height设置成wrap_content。 总之这样做不对记住就好。

不要视图将listView嵌入一个ScrollView,我曾经被这个害的很惨。

不要在adapter中缓存View.

你可能感兴趣的:(ListView,Google,I/O)