Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android ListView中使用简单动画高亮显示一行_Android_Listview_Animation - Fatal编程技术网

在Android ListView中使用简单动画高亮显示一行

在Android ListView中使用简单动画高亮显示一行,android,listview,animation,Android,Listview,Animation,我有一个带有自定义行的列表视图。它们有不同的背景色,请在ArrayAdapter的getView()方法中设置: public View getView(int position, View convertView, ViewGroup parent) { ... bgResourceId = R.color.white; if (items.get(position).status.contentEquals("ok")) { bgResourceId

我有一个带有自定义行的
列表视图
。它们有不同的背景色,请在
ArrayAdapter
getView()方法中设置:

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;
}
单击一行将启动一个新活动。完成新活动后,我们使用
列表视图返回活动,此时我需要突出显示其中一行

onResume()
方法中,而不是在触摸或单击行之后。 我确实知道哪一行(索引)会变高

只是一个简单的动画-可能会闪烁一秒钟,然后返回到其原始背景色。 大概是这样的:


这可能吗?

这并不像看上去那么琐碎。你必须

  • 确保时机正确
    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
    )。这是从过去开始的

    查看getViewByPosition(int-pos,ListView-ListView){ final int firstListItemPosition=listView.getFirstVisiblePosition(); final int lastListItemPosition=firstListItemPosition+listView.getChildCount()-1; if(poslastListItemPosition){ 返回listView.getAdapter().getView(pos,null,listView); }否则{ final int childIndex=pos-firstListItemPosition; 返回listView.getChildAt(childIndex); } }
  • 确保要突出显示的项目在任何情况下都可见。如果您不能保证这一点,因为可能有非常小的设备,或者您要突出显示的项目在列表中比您在问题中显示的列表中更靠后,那么您必须首先滚动到正确的位置。只有在滚动完成后,您才能安全地更改项目背景。因此,您必须为您的
    列表视图
    实现一个
    onScrollListener
    。现在,除非你告诉我,否则我认为这是没有必要的

  • 下面是它的外观:


    这可能吗。。。是的,它是跟随并在视图上添加自定义动画。谢谢@Selvin,现在,你能告诉我怎么做吗?你没有提供足够的信息。请发布适配器代码,包括指定不同背景颜色的代码。请告诉我们您希望在什么情况下突出显示该行—在事件之后(onTouch或onClick除外)、计时器完成之后或何时?还有:我们知道哪一行(索引)会突出显示吗?我刚刚更新了这个问题。实际上,我正在onResume()中将视图滚动到正确的位置;我会尝试一下,让你知道。这不完全是我想象的,但这是一个很好的起点。谢谢你的帮助。
    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);
        }
    }