2017-01-07 6 views
0

после добавления 2 новых функций (swipelayout + animation) мой ui зависает.Анимация замораживания с swipelayout

У меня есть recyclerview, который включает объекты фильма. Если я добавлю/удаляю/модифицирую фильм, я вызываю свой moviemanager, потому что есть концепция уведомления (все представления, которые хотят использовать данные, должны быть зарегистрированы у этого менеджера). Все это прекрасно работает, прежде чем добавить новые функции.

Я использую этот swipelayout: https://github.com/daimajia/AndroidSwipeLayout

В настоящее время элементы выглядит следующим образом:

enter image description here

После считывания:

enter image description here

Замораживание всегда воспроизводимы, если я имеют 4 элемента. Я прокручиваю второй элемент и удаляю его. Тогда он исчезнет, ​​как я хочу. После того, как я проскользнул, «новый» второй предмет замерзал как 10-15 секунд.

Схема XML элемента:

<com.daimajia.swipe.SwipeLayout 
    android:id="@+id/item_movie_swipe_layout" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <LinearLayout 
     android:id="@+id/item_movie_swipe_bottom_wrapper" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:background="#ff0000"> 

      <TextView 
       android:id="@+id/item_movie_bottom_delete_desc" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:drawableTop="@drawable/ic_delete_white_24dp" 
       android:text="@string/delete" 
       android:textColor="#fff" 
       android:layout_gravity="center" 
       android:padding="10dp"/> 
     </LinearLayout> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="5dp"> 

     <ImageView 
      android:id="@+id/item_movie_list_poster" 
      style="@style/image_border_style" 
      android:layout_width="68dp" 
      android:layout_height="100dp" 
      android:layout_marginRight="3dp" 
      android:background="@android:color/black"/> 

     <TextView 
      android:id="@+id/item_movie_list_name_year" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentEnd="true" 
      android:layout_alignParentRight="true" 
      android:layout_alignParentTop="true" 
      android:layout_marginBottom="3dp" 
      android:layout_toEndOf="@+id/item_movie_list_poster" 
      android:layout_toRightOf="@+id/item_movie_list_poster" 
      android:gravity="center|left" 
      android:padding="3dp" android:text="name"/> 

     <TextView 
      android:id="@+id/item_movie_list_genre" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentEnd="true" 
      android:layout_alignParentRight="true" 
      android:layout_below="@+id/item_movie_list_name_year" 
      android:layout_marginBottom="3dp" 
      android:layout_toEndOf="@+id/item_movie_list_poster" 
      android:layout_toRightOf="@+id/item_movie_list_poster" 
      android:padding="3dp" 
      android:text="Drama - Komödie - Action" android:textColor="@color/item_textyear" 
      android:textSize="12dp"/> 

     <TextView 
      android:id="@+id/item_movie_list_viewed" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignBottom="@id/item_movie_list_poster" 
      android:layout_toRightOf="@+id/item_movie_list_poster" 
      android:paddingLeft="3dp" android:text="Gesehen: " 
      android:textColor="@color/accept" 
      android:textSize="12dp"/> 
    </RelativeLayout> 
</com.daimajia.swipe.SwipeLayout> 

Соответствующий код адаптера:

@Override 
    public void onBindViewHolder(final CDMMoviesAdapter.IC_ViewHolder p_Holder, final int p_iPosition) { 

    // more unimportant code... 

    p_Holder.m_SwipeLayout.setShowMode(SwipeLayout.ShowMode.PullOut); 

    // Drag From Right 
    p_Holder.m_SwipeLayout.addDrag(SwipeLayout.DragEdge.Right, p_Holder.m_SwipeLayout.findViewById(R.id.item_movie_swipe_bottom_wrapper)); 

    // Handling different events when swiping 
    p_Holder.m_SwipeLayout.addSwipeListener(new SwipeLayout.SwipeListener() { 
     @Override 
     public void onClose(SwipeLayout layout) { 
     //when the SurfaceView totally cover the BottomView. 
     } 

     @Override 
     public void onUpdate(SwipeLayout layout, int leftOffset, int topOffset) { 
     //you are swiping. 
     } 

     @Override 
     public void onStartOpen(SwipeLayout layout) { 

     } 

     @Override 
     public void onOpen(SwipeLayout layout) { 
     //when the BottomView totally show. 
     } 

     @Override 
     public void onStartClose(SwipeLayout layout) { 

     } 

     @Override 
     public void onHandRelease(SwipeLayout layout, float xvel, float yvel) { 
     //when user's hand released. 
     } 
    }); 

    p_Holder.m_SwipeLayout.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View p_View) { 
     if((((SwipeLayout) p_View).getOpenStatus() == SwipeLayout.Status.Close)) { 
      Intent l_Intent = new Intent(); 
      Bundle l_Bundle = new Bundle(); 
      l_Bundle.putLong(CDMMovieDetailsActivity.ARG_MOVIE, l_MovieID); 
      l_Intent.putExtras(l_Bundle); 
      l_Intent.setClass(l_Context, CDMMovieDetailsActivity.class); 
      l_Context.startActivity(l_Intent); 
     } 
     } 
    }); 

    p_Holder.m_tvDelete.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View p_View) { 
     Animation l_DeleteAnimation = AnimationUtils.loadAnimation(l_Context, R.anim.slide_out); 
     l_DeleteAnimation.setAnimationListener(new Animation.AnimationListener() { 
      @Override 
      public void onAnimationStart(Animation animation) { 
      } 

      @Override 
      public void onAnimationRepeat(Animation animation) { 
      } 

      @Override 
      public void onAnimationEnd(Animation animation) { 
      mItemManger.removeShownLayouts(p_Holder.m_SwipeLayout); 
      CDMMovieManager.getInstance().removeMovieID(m_List, m_MovieIDs.get(p_iPosition)); 
      mItemManger.closeAllItems(); 
      } 
     }); 

     p_Holder.m_View.startAnimation(l_DeleteAnimation); 
     } 
    }); 

    // mItemManger is member in RecyclerSwipeAdapter Class 
    mItemManger.bindView(p_Holder.itemView, p_iPosition); 

    // more unimportant code... 
    } 

    /** 
    * This class is the viewholder. For internal use only. 
    */ 
    public static class IC_ViewHolder extends RecyclerView.ViewHolder { 

    /** 
    * Constructor 
    * 
    * @param p_View the view 
    */ 
    public IC_ViewHolder(View p_View) { 
     super(p_View); 

     m_View = p_View; 
     m_SwipeLayout = (SwipeLayout) p_View.findViewById(R.id.item_movie_swipe_layout); 

     m_tvNameYear = (TextView) p_View.findViewById(R.id.item_movie_list_name_year); 
     m_ivPoster = (ImageView) p_View.findViewById(R.id.item_movie_list_poster); 
     m_tvGenre = (TextView) p_View.findViewById(R.id.item_movie_list_genre); 
     m_tvViewed = (TextView) p_View.findViewById(R.id.item_movie_list_viewed); 

     m_tvDelete = (TextView) p_View.findViewById(R.id.item_movie_bottom_delete_desc); 
    } 

    public View m_View; 
    public SwipeLayout m_SwipeLayout; 

    public TextView m_tvNameYear; 
    public ImageView m_ivPoster; 
    public TextView m_tvGenre; 
    public TextView m_tvViewed; 

    public TextView m_tvDelete; 
    } 

В CDMMovieManager.getInstance().removeMovieID(m_List, m_MovieIDs.get(p_iPosition)); фильма будут удалены и все зарегистрированные мнения будут уведомлены. В этом случае фрагмент этого адаптера будет вызывать m_Adapter.notifyDataSetChanged();

анимация файл:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <translate 
     android:duration="250" 
     android:fromXDelta="0%" 
     android:toXDelta="-100%"/> 
</set> 

Я пытался что-то вроде View.clearAnimation() или Animation.setAnimationListener(null), но я всегда получаю эту проблему. Plase спросите, нужна ли вам дополнительная информация.

Update:

Проблема только встречается, если я пытаюсь ударить следующий пункт. (Например, удалите второй элемент. После этого попробуйте провести третий элемент, который является новым вторым элементом -> заморозить элемент, который я пытался пронести). Замораживание можно удалить только при прокрутке на любой другой предмет.

+0

Любые предложения? Я думаю, что проблема заключается в инициализации анимации и ее анималиста. Возможно, существует проблема синхронизации с 'onAnimationEnd()' и вызовом 'adapter.notifyDataSetChanged()' от менеджера. Я понятия не имею, как это исправить. Пожалуйста помоги. – beeb

ответ