0

我在使用自定义 ListAdapter 的派生 ListActivity 中显示事件列表。我有一个“今天”按钮,我想带我去最近的活动 - 很简单 - 我只需要调用 setSelection(n)。

但是然后我想简要地突出显示或闪烁或以某种方式将用户的注意力吸引到该项目上——只要足够长,以便他们可以看到最接近今天的项目

原因是,如果在 100 个项目的列表中,任何时候有 10 个项目在屏幕上可见,那么您是否已经跳到可见 10 个项目的顶部并不清楚,可见 10 底部的项目,或大致位于屏幕中间的项目(对于我的应用程序,我实际上更希望所选项目在屏幕中间突出显示 - 但这是另一项任务)。即使规则类似于“它始终是最上面的项目”,当我跳转到第 100 项时,它也会崩溃,因为现在屏幕顶部的项目是第 91 项。所以有动机。

我整个早上都在谷歌上搜索。这是我尝试过的一些事情。

在 onCreate(...) 期间:

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
getListView().setSelector(android.R.color.darker_gray);

如果我触摸列表中的一个项目,那效果很好,但是如果我使用我的“今天”按钮(调用 setSelection(n),列表会立即滚动到该项目,但不会以灰色突出显示该项目。

private void FocusToday()
{
    int today = getItemClosestToToday();
    this.setSelection(today);
    getListView().getSelectedView().setBackgroundColor(Color.RED);

getListView() 返回空值。

public void onCreate(Bundle savedInstanceState)
{
    ...
    m_ListView = this.getListView();
}

private void FocusToday()
{
    int today = getItemClosestToToday();
    this.setSelection(today);
    View view = m_ListView.getSelectedView();
    view.setBackgroundColor(Color.RED);

视图为空。

旁白:我一直在想我以前在哪里看到过这种行为,绞尽脑汁——它是一个安卓应用程序吗?一个iphone应用程序?网络应用程序?然后它击中了我 - 它在堆栈溢出中!当您单击答案的链接时,答案会以橙色突出显示大约半秒钟,然后橙色会消失!这就是我在我的应用程序中寻找的行为!

编辑:如果该项目一开始就在屏幕上,则以下工作,但如果该项目一开始就在屏幕外,那就没有用了。

View view = m_ListView.getChildAt(today);
view.setBackgroundColor(Color.RED);

如果今天超过可见项目的数量,则 View 为空。当我发现 getFirstVisiblePosition() 时,我以为我正在做某事。不幸的是,在这种情况下:

this.setSelection(today);
int firstVisible = m_ListView.getFirstVisiblePosition();

firstVisible 始终为 0,无论今天是范围内的数字还是可见项,还是超出该范围。添加 notifyDataSetChanged 没有区别:

this.setSelection(today);
getListAdapter().notifyDataSetChanged();
int firstVisible = m_ListView.getFirstVisiblePosition();

firstVisible 仍为 0。

4

1 回答 1

1

你应该有两种处理高光的方法。

如果该项目在屏幕上,请继续使用您拥有的作品。即找到视图并立即对其进行操作。

但是,如果它不在屏幕上,请从适配器启动 bindview()/getView 中的突出显示。

换句话说,如果您找不到视图,请设置一个带有要突出显示的 id 的标志。在您的 getView 中,突出显示具有该 ID 的单元格并清除标志。

于 2013-09-14T11:27:43.303 回答