从 RecyclerView 的过渡看起来很糟糕
Transition from RecyclerView looks bad
在为片段之间的过渡设置动画时,我发现从 为具有 RecyclerView
的片段设置动画时,视图往往会中断。
仔细查看 gif,因为它从 第二个(中间)片段移动到第一个和第三个片段。查看 CardView
的一部分是如何被删除的。
有什么方法可以让过渡更顺畅吗?我在 RecyclerView.Adapter 中阅读了一些关于数据绑定的内容以立即绑定数据,但我不知道这是否对这种特殊情况有帮助,因为它正在从 从 过渡 RecyclerView 片段故障。
主要活动xml:
<android.support.design.widget.CoordinatorLayout 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"
tools:context=".MainActivity">
<include
android:id="@+id/toolbar"
layout="@layout/toolbar"/>
<FrameLayout
android:id="@+id/mainFragment"
android:layout_below="@id/toolbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
任务片段xml:
<FrameLayout>
<android.support.v7.widget.RecyclerView />
</FrameLayout>
任务适配器:
public class TasksAdapter extends
RecyclerView.Adapter<TasksAdapter.ViewHolder> {
static class ViewHolder extends RecyclerView.ViewHolder {
TextView titleTextView;
TextView subTitle;
Button messageButton;
ImageView taskImage;
TextView taskDescription;
CardView cv;
ViewHolder(View itemView) {
super(itemView);
cv = (CardView) itemView.findViewById(R.id.cv);
titleTextView = (TextView) itemView.findViewById(R.id.task_title);
subTitle = (TextView) itemView.findViewById(R.id.task_subtitle);
messageButton = (Button) itemView.findViewById(R.id.message_button);
taskImage = (ImageView) itemView.findViewById(R.id.task_image);
taskDescription = (TextView) itemView.findViewById(R.id.task_description);
}
}
private List<Task> mTasks;
// Store the context for easy access
private Context mContext;
private Fragment fragment;
public TasksAdapter(Context context, List<Task> tasks) {
mTasks = tasks;
mContext = context;
}
private Context getContext() {
return mContext;
}
@Override
public TasksAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
// Inflate the custom layout
View taskView = inflater.inflate(R.layout.tasks_item, parent, false);
// Return a new holder instance
ViewHolder viewHolder = new ViewHolder(taskView);
return viewHolder;
}
@Override
public void onBindViewHolder(final TasksAdapter.ViewHolder viewHolder, final int position) {
// Get the data model based on position
Task task = mTasks.get(position);
// Set item views based on views and data model
TextView textView = viewHolder.titleTextView;
textView.setText(task.getTitle());
TextView subTitleTextView = viewHolder.subTitle;
subTitleTextView.setText(task.getSubTitle());
ImageView imageView = viewHolder.taskImage;
imageView.setImageResource(task.getImage());
TextView taskDescriptionTextView = viewHolder.taskDescription;
taskDescriptionTextView.setText(task.getDescription());
Button button = viewHolder.messageButton;
button.setText(task.getAction());
}
通过在 MainActivity 的 FrameLayout
中将设置 android:layout_height
添加到 fill_parent
来解决它。
像这样:
<FrameLayout
android:id="@+id/mainFragment"
android:layout_below="@id/toolbar"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
在为片段之间的过渡设置动画时,我发现从 为具有 RecyclerView
的片段设置动画时,视图往往会中断。
仔细查看 gif,因为它从 第二个(中间)片段移动到第一个和第三个片段。查看 CardView
的一部分是如何被删除的。
有什么方法可以让过渡更顺畅吗?我在 RecyclerView.Adapter 中阅读了一些关于数据绑定的内容以立即绑定数据,但我不知道这是否对这种特殊情况有帮助,因为它正在从 从 过渡 RecyclerView 片段故障。
主要活动xml:
<android.support.design.widget.CoordinatorLayout 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"
tools:context=".MainActivity">
<include
android:id="@+id/toolbar"
layout="@layout/toolbar"/>
<FrameLayout
android:id="@+id/mainFragment"
android:layout_below="@id/toolbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
任务片段xml:
<FrameLayout>
<android.support.v7.widget.RecyclerView />
</FrameLayout>
任务适配器:
public class TasksAdapter extends
RecyclerView.Adapter<TasksAdapter.ViewHolder> {
static class ViewHolder extends RecyclerView.ViewHolder {
TextView titleTextView;
TextView subTitle;
Button messageButton;
ImageView taskImage;
TextView taskDescription;
CardView cv;
ViewHolder(View itemView) {
super(itemView);
cv = (CardView) itemView.findViewById(R.id.cv);
titleTextView = (TextView) itemView.findViewById(R.id.task_title);
subTitle = (TextView) itemView.findViewById(R.id.task_subtitle);
messageButton = (Button) itemView.findViewById(R.id.message_button);
taskImage = (ImageView) itemView.findViewById(R.id.task_image);
taskDescription = (TextView) itemView.findViewById(R.id.task_description);
}
}
private List<Task> mTasks;
// Store the context for easy access
private Context mContext;
private Fragment fragment;
public TasksAdapter(Context context, List<Task> tasks) {
mTasks = tasks;
mContext = context;
}
private Context getContext() {
return mContext;
}
@Override
public TasksAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
// Inflate the custom layout
View taskView = inflater.inflate(R.layout.tasks_item, parent, false);
// Return a new holder instance
ViewHolder viewHolder = new ViewHolder(taskView);
return viewHolder;
}
@Override
public void onBindViewHolder(final TasksAdapter.ViewHolder viewHolder, final int position) {
// Get the data model based on position
Task task = mTasks.get(position);
// Set item views based on views and data model
TextView textView = viewHolder.titleTextView;
textView.setText(task.getTitle());
TextView subTitleTextView = viewHolder.subTitle;
subTitleTextView.setText(task.getSubTitle());
ImageView imageView = viewHolder.taskImage;
imageView.setImageResource(task.getImage());
TextView taskDescriptionTextView = viewHolder.taskDescription;
taskDescriptionTextView.setText(task.getDescription());
Button button = viewHolder.messageButton;
button.setText(task.getAction());
}
通过在 MainActivity 的 FrameLayout
中将设置 android:layout_height
添加到 fill_parent
来解决它。
像这样:
<FrameLayout
android:id="@+id/mainFragment"
android:layout_below="@id/toolbar"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>