Pas d'animation sur le point de retrait sur RecyclerView
Je suis en utilisant RecyclerView
pour la première fois. Tout fonctionne bien sauf qu'il n'y a pas d'animation sur le point de retrait, même si l'animation sur le point outre fonctionne très bien.
Je n'ai pas mis tout élément personnalisé animateur, mais selon la la documentation:
Animations pour l'ajout et la suppression d'éléments sont activés par défaut dans
RecyclerView
.
Donc les animations sur la dépose du travail.
Je voudrais avoir de l'animation par défaut sur l'enlèvement, mais ne pouvez pas obtenir que cela fonctionne.
C'est de cette façon que je peux configurer le RecyclerView:
private void setupRecyclerView() {
mRecyclerView = (RecyclerView) mRootView.findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
View emptyView = mRootView.findViewById(R.id.empty_view);
mAdapter = new RoutineAdapter(getActivity(), mRoutineItems, emptyView);
mRecyclerView.setAdapter(mAdapter);
}
C'est mon adaptateur:
private class RoutineAdapter
extends RecyclerView.Adapter<RoutineAdapter.ViewHolder> {
private final Context mContext;
private List<RoutineItem> mData;
private View mEmptyView;
public RoutineAdapter(Context context, List<RoutineItem> data, View emptyView) {
mContext = context;
mData = data;
mEmptyView = emptyView;
setEmptyViewVisibility();
}
public void add(RoutineItem routineItem, int position) {
mData.add(position, routineItem);
setEmptyViewVisibility();
notifyItemInserted(position);
}
public void remove(int position){
mData.remove(position);
setEmptyViewVisibility();
notifyItemRemoved(position);
}
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final View view = LayoutInflater.from(mContext).inflate(
R.layout.fragment_routines_list_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
final RoutineItem routineItem = getItem(position);
holder.circle.setBackgroundResource(
colorNumberToDrawableResource(routineItem.colorNumber));
holder.initial.setText(routineItem.routineName.substring(0, 1));
holder.routineName.setText(routineItem.routineName);
holder.lastTimeDone.setText(routineItem.lastTimeDoneText);
if (routineItem.isSelected) {
holder.itemView.setBackgroundColor(
getResources().getColor(R.color.background_item_selected));
} else {
holder.itemView.setBackgroundResource(
R.drawable.darker_background_on_pressed);
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.onRoutineClicked(routineItem.routineName);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mPresenter.onRoutineLongClicked(routineItem.routineName);
return true;
}
});
}
@Override
public int getItemCount() {
return mData.size();
}
public RoutineItem getItem(int position) {
return mData.get(position);
}
private void setEmptyViewVisibility() {
if (getItemCount() == 0) {
mEmptyView.setVisibility(View.VISIBLE);
} else {
mEmptyView.setVisibility(View.GONE);
}
}
class ViewHolder extends RecyclerView.ViewHolder {
public final View circle;
public final TextView initial;
public final TextView routineName;
public final TextView lastTimeDone;
public ViewHolder(View view) {
super(view);
circle = view.findViewById(R.id.circle);
initial = (TextView) view.findViewById(R.id.initial);
routineName = (TextView) view.findViewById(R.id.routine_name);
lastTimeDone = (TextView) view.findViewById(R.id.last_time_done);
}
}
}
Fragment_routines_list_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minHeight="@dimen/standard_list_item_height"
android:paddingBottom="8dp"
android:background="@drawable/darker_background_on_pressed"
android:clickable="true">
......
</RelativeLayout>
Ce que je fais mal qui provoque le défaut de retrait de l'animation ne fonctionne pas?
Vous devez vous connecter pour publier un commentaire.
La bonne façon de supprimer un élément de recycleur de vue, c'est de supprimer l'élément de l'ensemble de données, puis de dire à la carte que l'élément est retiré comme
Résolu.
Le problème est que, après l'appel de
mAdapter.remove(position)
, une autre partie de mon code a l'appel demAdapter.notifyDataSetChanged()
qui, je suppose arrête le retrait de l'animation.Pour résumer, si vous appelez
mAdapter.notifyDataSetChanged
bien qu'il y est une animation continue l'animation s'arrête.Utilisation
notifyItemRemoved(position)
au lieu denotifyDataSetChanged()
comme ci-dessousparce que
notifyDataSetChanged()
simplement informe de la mise à jour des données sans animations.J'ai été en mesure de supprimer l'affichage de l'animation et de la mise à jour des indices comme suit:
Au sein de l'adaptateur,
Tout en éliminant les points de vue, l'appel
J'ai utilisé un booléen pour s'assurer qu'un double-clic,etc. ne pas provoquer un plantage.
Une autre raison pour l'un ne fonctionne pas correctement supprimer l'animation pourrait être le
RecyclerViews
hauteur. Vérifiez que la hauteur estmatch_parent
et PASwrap_content
!wrap_content
mais pas la suppression de l'un. De toute façon pour contourner ce problème?après de longues débogage, j'ai dû ajouter
setHasStableIds(true)
de ma carte et de mettre en œuvreaprès que supprimer l'animation a commencé à travailler
Tard, mais peut être utile à quelqu'un, qui veulent {articles de recherche avec l'animation}
Utilisez code ci-dessous Dans votre activité ou fragment où
Utilisez code ci-dessous dans votre RecyclerAdapter classe
J'ai couru dans la même question, et j'ai fixé ce, par la mise en œuvre de mon propre RecyclerView, et dans mon recyclerview, j'ai fait ça:
Fondamentalement, lorsque vous ajoutez/supprimer un élément dans/à partir de recyclerview, vous pouvez appeler notifyItemInserted()/notifyItemRemoved() et notifyItemRangeChanged(), cette méthode va appeler
onItemRangeRemoved()
/onItemRangeInserted()
dansmDataObserver
. Donc, dans ces méthodes, vous pouvez mettre à jour vide de la vue de la visibilité, et il ne cassera pas la d'animations.