ListView setActivated()。多个列表中的相同项目

时间:2013-05-10 11:51:40

标签: android android-listview

我有两个窗格布局:

  • Pane A :这是一个包含5个ListFragments的ViewPager。
  • 窗格B :当您在任何列表中单击窗格A中的项目时,将在列表项视图上执行setActivated(true),并更新窗格B内容。

其他几点:

  • 一个列表中的项目可以出现在任何其他列表中。
  • 每个列表中的每个项目都是数据库中相同类型的数据。
  • setActivated()目前在我的ListFragment的onListItemClick()方法中执行。

我的问题:

单击某个项目时,会在该项目上使用setActivated(true)将该行突出显示为内容中显示的当前激活的行。但是当用户使用ViewPager滚动到另一个列表时,该项也可能存在于另一个列表中,我想强调它也被激活。

那么您认为以合理优雅的方式实现这种片段间通信的最佳方式是什么?

2 个答案:

答案 0 :(得分:0)

更简洁的方法是,如果所有这些片段都属于同一个活动,可能会有一个无ui片段来保存您想要分享的列表。
只是要小心,你不希望该列表中的任何视图,只需要数据,除非你热衷于创建内存泄漏。 作为奖励,您可以使用{ui less片段setRetainInstance(true)来保留您的项目。

答案 1 :(得分:0)

好的,这就是我解决这个问题的方法,我很满意..

  • 当用户点击列表中的项目时,会做两件事。 1)更改内容。 2)发出广播意图,声明现在正在显示特定ID的项目。
  • 然后每个ListFragment为上述intent实现BroadcastReceiver。此BroadcastReceiver在onPause / onResume片段方法中注册和注销。
  • BroadcastRecievers运行一个方法,检查ListView中显示的当前可见项。这种方法的逻辑是这样的......

private void setVisibleItemActivated(Long id)
{
    for (int i = getListView().getFirstVisiblePosition(); i <= getListView().getLastVisiblePosition(); i++)
    {
        Cursor cursor = (Cursor) getListView().getItemAtPosition(i);
        Long gameId = cursor.getLong(cursor.getColumnIndex("_id"));
        View view = getListView().getChildAt(i);

        if (view.isActivated())
        {
            if (gameId != id)
                view.setActivated(false);
        }
        else
        {
            if (gameId == id)
                view.setActivated(true);
        }
    }
}

...因此它会检查该列表中当前是否显示该ID。

  • 但是如果该项目不可见并且仍然在列表中,则列表适配器bindView()方法在项目变为可见时初始化该项目的视图设置视图的激活状态。