java - ListView 共享元素转换问题

标签 java android android-listview android-view android-transitions

我正在尝试在两个 Activity 之间创建共享元素转换。这似乎可以在两个布局之间找到,每个布局都包含一个 ImageView。但是,我在使用 ListView 进行此转换时遇到了问题。

问题是当用户点击第一行时,转换将按预期进行。但是,当点击第二行时,转换的原点似乎也是第一行的图像!

我创建了一个带有自定义行布局的简单 ListView :

row_detailed.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="1">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Daft Punk"
        android:id="@+id/primary_textview"
        android:layout_gravity="center_horizontal"
        android:layout_weight="0.07"
        android:layout_alignTop="@+id/primary_imageview"
        android:layout_toRightOf="@+id/primary_imageview" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Random Access Memories"
        android:id="@+id/textView4"
        android:layout_gravity="center_horizontal"
        android:layout_weight="0.07"
        android:layout_alignBottom="@+id/primary_imageview"
        android:layout_toRightOf="@+id/primary_imageview" />


    <ImageView
        android:layout_width="84dp"
        android:layout_height="84dp"
        android:id="@+id/primary_imageview"
        android:src="@drawable/ram"
        android:layout_weight="0.07" />

</RelativeLayout>

辅助 Activity 的布局,activity_transition_secondary.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="legiocode.com.tapstrprototype.activity.TransitionSecondaryActivity">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/secondary_imageview"
        android:src="@drawable/ram"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>

主要 Activity ,TransitionPrimaryActivity.java:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transition_primary);

        ListView listView = (ListView)findViewById(R.id.listView2);
        ArrayAdapter<String> adapter = new ArrayAdapter(this,
                R.layout.row_detailed,
                R.id.primary_textview,
                items);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                String transitionName = getString(R.string.transition_image) + String.format("_%d", i);

                ImageView imageView = (ImageView)findViewById(R.id.primary_imageview);
                imageView.setTransitionName(transitionName);

                Intent intent = new Intent(TransitionPrimaryActivity.this, TransitionSecondaryActivity.class);
                intent.putExtra(TransitionSecondaryActivity.TRANSITION_NAME, transitionName);

                ActivityOptionsCompat options =
                        ActivityOptionsCompat.makeSceneTransitionAnimation(TransitionPrimaryActivity.this,
                                imageView,   // The view which starts the transition
                                transitionName    // The transitionName of the view we’re transitioning to
                        );
                ActivityCompat.startActivity(TransitionPrimaryActivity.this, intent, options.toBundle());
            }
        });
    }

辅助 Activity ,TransitionSecondaryActivity.java:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transition_secondary);

        String transitionName = getIntent().getStringExtra(TRANSITION_NAME);

        ImageView imageView = (ImageView)findViewById(R.id.secondary_imageview);
        imageView.setTransitionName(transitionName);
    }

我已经尝试过动态地实现转换名称,但这似乎并没有太大的区别。我是否正确设置了转换?

最佳答案

您必须访问您实际点击的 View (在本例中为参数view)

onItemClick(AdapterView<?> adapterView, View view, int i, long l)

ImageView imageView = (ImageView)findViewById(R.id.primary_imageview);

您始终访问列表中的第一个元素。

PS:将转换名称放在 xml 中。使其更易于阅读。

关于java - ListView 共享元素转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30565249/

相关文章:

android - 使用 viewLifecycleOwner 作为 LifecycleOwner

java - 在执行某些操作后设置 ListView 背景颜色

android - Android 中滑出时的类似通知的列表元素删除

java - Android 根据内容更改 ListView 子文本颜色

java - 将当前游戏中的得分添加到 Android 中的长期统计数据中

Java 泛型 NoSuchMethodError

Java堆增长

java - 具有策略模式的单例

android - Dagger2 继承的子组件多重绑定(bind)

android - 在 Android 应用内计费