【问题标题】:Recycler Item Material transition not working correctlyRecycler Item 材料​​转换无法正常工作
【发布时间】:2017-09-19 10:34:01
【问题描述】:

我有一个RecyclerView,其中包含已填充的项目(ImageView,2x TextView)。在项目点击我开始一个新的Activity。我想使用 Material 过渡,我想在其中重新排列 ImageView

ImageViews 共享相同的转换名称。

问题:当我按下项目时,动画开始工作,新活动从过渡开始,但如果我点击 低于第一个项目的项目, 过渡仍将在第一行开始和结束

@Override
public void openUserDetails(UiBaseUser data, View view, int position) {
    iwAvatar = ButterKnife.findById(this, R.id.iw_avatar);

    Pair<View, String> p1 = Pair.create(iwAvatar, "avatar");
    ActivityOptionsCompat optionsCompat = ActivityOptionsCompat
            .makeSceneTransitionAnimation(this, p1);
    startActivity(UserDetailActivity.getIntent(getApplicationContext(), data), optionsCompat.toBundle());
}

以上代码在SourceActivity中执行,并没有直接链接到item_listXML布局。这就是为什么我在那里使用Butterknife 来找到我想要制作动画的ImageView - 但是,这似乎只抓住了第一个元素ImageView,而不是实际按下的ImageView

这是我的adapter class(我想我在这里遗漏了一些东西)。在这个 ViewHolder 类中,我参考了 ImageView 所在的布局 UserListLayout (item_list)。

public class UsersAdapter extends BaseAdapter<UiBaseUser, UsersAdapter.UserVH> {

    private final LayoutInflater layoutInflater;

    public UsersAdapter(Context context) {
        this.layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public UserVH onCreateViewHolder(ViewGroup parent, int viewType) {
        return new UserVH(layoutInflater.inflate(R.layout.item_users, parent, false));
    }

    @Override
    public void onBindViewHolder(UsersAdapter.UserVH holder, int position) {
        ViewCompat.setTransitionName(holder.layout.getIwAvatar(), "image_view_" + position);
        holder.onBind(getItem(position));
    }

    public class UserVH extends RecyclerView.ViewHolder {

        private UserListLayout layout;

        public UserVH(View itemView) {
            super(itemView);
            layout = (UserListLayout) itemView;
        }

        public void onBind(UiBaseUser item) {
            layout.bind(item);
        }

    }
}

TargetActivity sn-p

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user_detail);
    ButterKnife.bind(this);
    initializeDagger();

    bundle = getIntent().getExtras();

    if (bundle != null) {
        transitionName = bundle.getString(EXTRA_TRANSITION_NAME);
        presenter.onCreate(baseData);
    } else {
        throw new IllegalStateException("Initial bundle in UserDetail Activity is null");
    }

    iwAvatar.setTransitionName(transitionName);    
}

我觉得我错过了一些简单的东西 - 但是连续几个小时的编码已经让我的大脑筋疲力尽,无法看穿它。请帮帮我。

【问题讨论】:

  • 您正在更改列表项的过渡名称,但您的示例中没有任何内容表明目标 Activity 的视图相同。
  • 我在 create sn-p 上添加了目标活动,以展示我是如何通过 Bundle 设置过渡名称的。我不想把所有代码都放在这里,因为人们通常会忽略较长的帖子。
  • 您是否检查了transitionName 是否在您的目标Activity 中包含具有正确位置索引的预期值(我猜是UserDetailActivity)?
  • 确实如此。如果我仅将我的 RecyclerClickListener 隔离到 ImageView (iw.setOnItemClickListener()),这非常有效,但是在这种情况下,如果用户按下行中的其他位置,则不会发生任何事情。如果在 ImageView 上按下,则过渡按应有的方式工作。但我希望即使用户按下 TextView 也能进行转换(仍然 Imageview 应该动画)

标签: android animation android-recyclerview material-design transition


【解决方案1】:

您的问题在于点击处理程序(openUserDetails(...) 会这样做,如果我是正确的)。

iwAvatar = ButterKnife.findById(this, R.id.iw_avatar); 在这里不起作用,因为您的布局中有多个具有相同 ID R.id.iw_avatar 的视图。您可以执行以下操作来找到正确的ImageView 实例:

  1. 将选定的视图(可能是你的 itemView in UserVH)传递给 openUserDetails(...)我猜你现在也这样做了
  2. 在此view 参数上调用findViewById(...) 以找到实际的ImageView

【讨论】:

  • 听起来它可以工作,将测试并让您知道。感谢您的建议!
  • 我在活动和适配器之间创建了一个接口,并在适配器内监听 onClickEvents,我可以在项目上获取 getAdapterPosition(),然后在 ViewHolder 中搜索 ImageView。你的回答让我明白了这一点,所以我接受了。再次感谢!
猜你喜欢
  • 2018-07-19
  • 2020-04-11
  • 1970-01-01
  • 2019-03-30
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多