如上图,有一个列表,可能很长,有些没显示出来。当点击某一项时该项显示“正在播放”。
由于安卓并不像网页样,把所有列表项都加载起,而只是把当前需要显示的加载起,所以这个处理方式跟网页、跟 WinForm 还不一样。
首先,我们需要给 Adapter 设置一个 int 成员,比如名叫 m_playingIndex
用以记录当前播放项。
何时给这个 m_playingIndex 赋值呢?就是在 getView 中的 view.setOnClickListener 中。
然后,在Adapter 的 getView 中根据 m_playingIndex 值显示不同的图标holder.title.setText(datas.get(i).title);
if (i != m_playingIndex) {
// 显示正在播放按钮
}
else {
// 显示播放按钮
}
这个是在滚动时触发的,也就是说为了保证滚动时也能够在正确的位置显示正确的按钮。
最后,需要一个立即响应事件处理
第二步说了,那个只是在滚动时触发,不滚动时不触发,也就无法更新界面,那么我们需要在点击了之后也更新。
那我们就需要 Adapter 设置一个事件了,在前面为 m_playingIndex 赋值后,就触发这个事件,这个事件交由 Activity 中处理(因为我们要用 m_listView,所以用事件跳出 Adapter)。int visibleFirstPos = m_listView.getFirstVisiblePosition();
int visibleLastPos = m_listView.getLastVisiblePosition();
for (int i = visibleFirstPos; i <= visibleLastPos; i++) { // 注意 i <=
View view = m_listView.getChildAt(i - visibleFirstPos); // i 是指数据项 index,但并不一定与 listView 的控件项一一对应,所以这里 - visibleFirstPos
ViewHolder holder = (ViewHolder)view.getTag();
if (m_listViewAdapter.m_playingIndex == i) {
// 显示正在播放按钮
}
else {
// 显示播放按钮
}
}
关于事件,可以参见本连载前面的文章。