0

我有两个窗格布局:

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

补充几点:

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

我的问题:

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

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

4

2 回答 2

0

如果所有这些片段都属于同一个活动,那么执行此操作的更简洁的方法可能是使用一个无 ui 的片段来保存您要共享的列表。
请注意,您不希望该列表中的任何视图,只需要数据,除非您热衷于创建内存泄漏。作为奖励,您可以setRetainInstance(true)在该 ui less 片段上使用在旋转期间保留您的项目。

于 2013-05-10T12:16:10.047 回答
0

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

  • 当用户单击列表中的项目时,会做两件事。1) 改变内容。2) 发出广播意图,说明现在正在显示特定 ID 的项目。
  • 然后每个 ListFragment 为上述意图实现一个 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() 方法会在项目变得可见时初始化项目的视图,从而设置视图的激活状态。
于 2013-05-11T15:40:43.197 回答