我有ListView
个自定义行。它们具有不同的背景颜色,设置为getView()
的{{1}}方法:
ArrayAdapter
单击某行可启动新活动。在完成新的Actvity之后,我们返回到public View getView(int position, View convertView, ViewGroup parent) {
...
bgResourceId = R.color.white;
if (items.get(position).status.contentEquals("ok")) {
bgResourceId = R.color.green;
} else items.get(position).status.contentEquals("error")) {
bgResourceId = R.color.red;
}
row.setBackgroundResource(bgResourceId);
return row;
}
的Activity,在他的位置我需要突出显示其中一行。
在ListView
方法内,不是在触摸或点击该行之后。
我知道哪一行(索引)会被高估。
只是一个简单的动画 - 可能会闪烁一秒钟,然后返回其原始背景颜色。 像这样:
这可能吗?
答案 0 :(得分:1)
这并不像看起来那么微不足道。你必须
确保时机合适。 onResume
不允许您访问项目视图,因此您应该使用onWindowsFocusChanged
。把它放在你的活动中:
Handler handler = new Handler();
int blink = 4;
int regularBg = android.R.color.holo_orange_light;
int blinkingBg = android.R.color.holo_orange_dark;
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
final View view = adapter.getViewByPosition(blink, listView);
view.setBackgroundResource(blinkingBg);
handler.postDelayed(new Runnable() {
@Override
public void run() {
view.setBackgroundResource(regularBg);
listView.setOnScrollListener(null);
}
}, 1000);
}
}
通过添加到适配器的自定义方法访问项目视图(不会通过常规getView
工作)。它来自here。
View getViewByPosition(int pos, ListView listView) {
final int firstListItemPosition = listView.getFirstVisiblePosition();
final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;
if (pos < firstListItemPosition || pos > lastListItemPosition) {
return listView.getAdapter().getView(pos, null, listView);
} else {
final int childIndex = pos - firstListItemPosition;
return listView.getChildAt(childIndex);
}
}
确保在任何情况下都可以看到要突出显示的项目。如果您无法保证这一点,因为可能会有非常小的设备或您要突出显示的项目位于列表的下方而不是您在问题中显示的列表中,您必须先滚动到正确的位置。滚动完成后,您可以安全地更改项目背景。因此,您必须为onScrollListener
实施ListView
。现在,除非你告诉我,否则我认为这不是必要的。
以下是它的外观: