Android 5.0 列表动画

Android 5.0 List Animation

我有一个由 ViewTextView 组成的项目列表。我定义了一个动画:

View mView = findViewById(R.id.view);
Intent detailIntent = new Intent(this, DetailActivity.class);
String transitionName = getString(R.string.my_transition);
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
                mView, transitionName);
startActivity(detailIntent, options.toBundle());

在我的 list_item.xml 中我有:

<View
    android:id="@+id/view"
    android:layout_width="@dimen/list_dimen"
    android:layout_height="match_parent"
    android:layout_marginStart="0dp"
    android:background="@color/accent"
    android:transitionName="@string/my_transition"/>

第一个项目的过渡效果很好,但无论我单击列表中的哪个项目,动画总是来自第一个项目,如果我滚动到第一个项目不在视图中的位置当我点击一个项目时,应用程序强制关闭。如何将动画附加到特定列表项?

解决方案:

根据 MarcaoAS 的回答,我必须将视图附加到特定的根视图。我正在实现一个 Master-Detail 关系,所以我的列表有一个 Fragment,其中包含一个 Callbacks :

public interface Callbacks {
    public void onItemSelected(String id);
}

我不得不对其进行编辑以将 View 作为参数而不是 StringonItemSelected(View view)

同样,我必须在引用的地方进行此更改。生成 Fragment 时(我在 Android Studio 中创建项目时选择了 Master-Detail),onListItemClick 被覆盖:

@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
    super.onListItemClick(listView, view, position, id);
    mCallbacks.onItemSelected(view);
}

如您所见,我再次将 id 替换为传入的 view

在我的 ListActivity 中,我在上面发布了我的原始代码,现在我有:

@Override
public void onItemSelected(View view) {
    //tablet
    if (mTwoPane) {
        //tablet handling 
    }
    //phone
    else {
        View mView = view.findViewById(R.id.view);
        Intent detailIntent = new Intent(this, DetailActivity.class);
        String transitionName = getString(R.string.my_transition);
        ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
                mView, transitionName);
        startActivity(detailIntent, options.toBundle());
    }
}

再次从Fragmentclass传入View。这解决了我的问题。

确保下面的代码是return项目视图。

View mView = findViewById(R.id.view);

如果您从 activity 调用它,它将始终 return 第一个项目,因为您的项目可能具有相同的 ID。尝试在您的 onClick 方法中这样做:

public void onClick(View v) {
    View mView = v.findViewById(R.id.view);
    Intent detailIntent = new Intent(this, DetailActivity.class);
    String transitionName = getString(R.string.my_transition);
    ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, mView, transitionName);
    startActivity(detailIntent, options.toBundle());
}