Recycler Item物料转换无法正常工作

时间:2017-04-22 12:44:38

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

我有RecyclerView个已填充的项目(ImageView,2x TextView)。点击项目后,我开始新的Activity。我想使用材质转换,我想重新排列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_list XML布局的直接链接。这就是为什么我在那里使用Butterknife来查找我想要设置动画的ImageView - 然而,这似乎只抓住了第一个元素ImageView而不是ImageView实际上是按下了。

这是我的adapter class(我假设我在这里遗漏了一些东西)。在此ViewHolder类中,我引用了UserListLayout所在的布局item_listImageView)。

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代码段

@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);    
}

我觉得我错过了一些简单的东西 - 但是直接的编码时间已经足够用尽我的大脑,没有看透。请帮帮我。

1 个答案:

答案 0 :(得分:1)

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

iwAvatar = ButterKnife.findById(this, R.id.iw_avatar);无法在此处使用,因为您的布局中有多个具有相同ID R.id.iw_avatar的视图。您可以执行以下操作以查找正确的ImageView实例:

  1. 将所选视图(可能是itemView 中的UserVH)传递给openUserDetails(...)我想你现在也是这样做
  2. 致电findViewById(...) param view,找到实际的ImageView