2017-04-11 8 views
4

「events」のリストを含むrecyclerviewを作成しました。これは5未満のイベントのリストでうまく動作しますが、リスト内で6つ以上のイベントが発生すると、最後のイベントは展開されませんクリックすると消えます。終了アニメーションもリスト内の6つ以上のイベントで動作しなくなります。それがどのように振る舞うべきかAndroid animating recyclerview

  • ユーザーは、ビューがそれに戻って崩壊元のサイズ
  • ユーザーが別のイベントながら、イベントをタップします>ビューがフルスクリーンに展開
  • ユーザーが拡大し、イベントをタップ>イベントをタップ

    :タップイベントが

現在の動作をフルスクリーンに拡大エン拡大>拡大イベントが元の高さに設定されています3210

  • ユーザーは
  • ユーザータップはイベント>ビューの崩壊を拡大したが
  • 別のイベント>が拡大イベント展開されている間、ユーザーがイベントをタップをアニメーション化しない>すべてのビューがリスト内の最後の項目を除いて、正しく展開するイベントをタップ崩壊、タップイベントが
  • ユーザーがリスト内の最後のイベントをタップし、正しく展開する>イベント。消えるが、私はそれはおそらく道とは何かを持って知っている

(おそらくそれが0以下にサイズです減)recyclerviewの再利用その意見彼らは画面から外れています。この問題を解決するには、リストの位置ではなくeventIdによってタップされたイベントの位置を確認しますが、これは私が上記の問題を残しています。

public class EventRecyclerAdapter extends RecyclerView.Adapter<EventRecyclerAdapter.ViewHolder> { 
    private Context c; 
    private List<Event> items = new ArrayList<>(); 
    private RelativeLayout container; 
    private int screenheight; 
    private EventListFragment eventListFragment; 
    private int expandedPosition = -1; 
    private static final String TAG = "EventRecyclerAdapter"; 

    public interface ItemClickedListener { 
     void itemClicked(int position); 
    } 

    private ItemClickedListener itemClickedListener; 

    public EventRecyclerAdapter(List<Event> itemlist, Context c, EventListFragment eventListFragment, ItemClickedListener listener) { 
     this.items = itemlist; 
     this.c = c; 
     this.eventListFragment = eventListFragment; 
     this.itemClickedListener = listener; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     // create a new view 
     View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, null); 

     WindowManager wm = (WindowManager) c.getSystemService(Context.WINDOW_SERVICE); 
     Display display = wm.getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     screenheight = size.y; 

     // Get the screen height from the device 
     Resources r = c.getResources(); 
     float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 80, r.getDisplayMetrics()); 
     screenheight -= px; 

     ViewHolder viewHolder = new ViewHolder(itemLayoutView); 
     return viewHolder; 
    } 

    // Replace the contents of a view (invoked by the layout manager) 
    @Override 
    public void onBindViewHolder(ViewHolder viewHolder, int position) { 
     Event event = items.get(position); 
     // - get data from your itemsData at this position 
     // - replace the contents of the view with that itemsData 
     viewHolder.tvName.setText(event.getName()); 
     viewHolder.tvLocation.setText(event.getLocation().getName()); 
     viewHolder.tvDate.setText(Helper.dateDoubleToString(event.getStartDate())); 
     viewHolder.tvTicketCount.setText(String.valueOf(event.getNumberOfTickets())); 
     viewHolder.background.setBackgroundColor(Color.GRAY); 
     viewHolder.eventId = event.getId(); 

     // Load the background image 
     if (event.getEventImageId() != null) { 
      Picasso.with(c).load(Helper.imageUrlString(event.getEventImageId())).into(viewHolder.background); 
      ColorMatrix matrix = new ColorMatrix(); 
      matrix.setSaturation(0); 

      ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); 
      viewHolder.background.setColorFilter(filter); 
     } 

     // Check if the view needs to be expanded, collapsed or just drawn normally. 
     if (expandedPosition == event.getId()) { 
      if (event.expanded) { 
       collapseView(viewHolder, event); 
      } else if (!event.expanded) { 
       expandView(viewHolder, position, event); 
      } 
     } else { 
      setContainerHeight(viewHolder, event); 
     } 
    } 

    private void expandView(final EventRecyclerAdapter.ViewHolder viewHolder, final int pos, Event event) { 
     ResizeAnimation resizeAnimation = new ResizeAnimation(
       viewHolder.container, 
       viewHolder.container.getHeight(), 
       screenheight 
     ); 
     resizeAnimation.setDuration(Constants.ANIMATION_SPEED); 
     resizeAnimation.setAnimationListener(new Animation.AnimationListener() { 
      @Override 
      public void onAnimationStart(Animation animation) { 
      } 

      @Override 
      public void onAnimationEnd(Animation animation) { 
       viewHolder.infoContainer.setVisibility(View.VISIBLE); 
       viewHolder.closeIcon.setVisibility(View.VISIBLE); 
       itemClickedListener.itemClicked(pos); 
      } 

      @Override 
      public void onAnimationRepeat(Animation animation) { 
      } 
     }); 
     viewHolder.itemView.startAnimation(resizeAnimation); 
     viewHolder.expanded = true; 

     event.expanded = true; 
    } 

    private void collapseView(final EventRecyclerAdapter.ViewHolder viewHolder, Event event) { 
     ResizeAnimation resizeAnimation = new ResizeAnimation(
       viewHolder.container, 
       viewHolder.container.getHeight(), 
       getContainerCollapsedHeight() 
     ); 
     resizeAnimation.setDuration(Constants.ANIMATION_SPEED); 

     viewHolder.infoContainer.setVisibility(View.INVISIBLE); 
     viewHolder.closeIcon.setVisibility(View.INVISIBLE); 
     viewHolder.itemView.startAnimation(resizeAnimation); 
     viewHolder.expanded = false; 
     event.expanded = false; 
} 

    private void setContainerHeight(EventRecyclerAdapter.ViewHolder viewHolder, Event event) { 
     viewHolder.container.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getContainerCollapsedHeight())); 
     viewHolder.infoContainer.setVisibility(View.INVISIBLE); 
     viewHolder.closeIcon.setVisibility(View.INVISIBLE); 
     event.expanded = false; 
     viewHolder.expanded = false; 
    } 

    private int getContainerCollapsedHeight() { 
     int containerHeight; 
     // Define the item containers height 
     if (items.size() <= 3) { 
      containerHeight = screenheight/items.size(); 
     } else { 
      containerHeight = screenheight/3; 
     } 
     return containerHeight; 
    } 

    /** 
    * Clear all current data and swap add the new data list. 
    * The expanded position also gets reset 
    * @param events 
    */ 
    public void swap(List<Event> events) { 
     this.items.clear(); 
     this.items.addAll(events); 
     this.expandedPosition = -1; 

     Log.v(TAG,"SWAP SIZE : " + items.size()); 
     notifyDataSetChanged(); 
    } 

    // inner class to hold a reference to each item of RecyclerView 
    class ViewHolder extends RecyclerView.ViewHolder { 

     public TextView tvLocation, tvDate, tvTicketCount; 
     public TextView tvName; 
     public ImageView background; 
     public View container; 
     public View infoContainer; 
     public TextView closeIcon; 
     public int eventId; 
     public boolean expanded = false; 

     public ViewHolder(final View itemLayoutView) { 
      super(itemLayoutView); 

      tvName = (TextView) itemLayoutView.findViewById(R.id.tvName); 
      tvLocation = (TextView) itemLayoutView.findViewById(R.id.tvLocation); 
      tvDate = (TextView) itemLayoutView.findViewById(R.id.tvDate); 
      background = (ImageView) itemLayoutView.findViewById(R.id.background); 
      tvTicketCount = (TextView) itemLayoutView.findViewById(R.id.ticket_count); 
      container = itemLayoutView.findViewById(R.id.list_item_container); 
      infoContainer = itemLayoutView.findViewById(R.id.info_container); 
      closeIcon = (TextView) itemLayoutView.findViewById(R.id.close_icon); 

      infoContainer.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Activity mainActivity = (Activity) c; 
        FragmentManager fm = mainActivity.getFragmentManager(); 
        //add 
        FragmentTransaction ft = fm.beginTransaction(); 
        ft.setCustomAnimations(R.animator.slide_to_top, R.animator.slide_from_bottom); 
        ft.addToBackStack(ft.toString()); 
        ft.add(R.id.content_frame, EventFragment.newInstance(items.get(getAdapterPosition())), Constants.EVENT_FRAGMENT_TAG); 
        //commit change 
        ft.commit(); 
       } 
      }); 

      container.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        expandedPosition = eventId; 
        notifyDataSetChanged(); 
       } 
      }); 
     } 
    } 

    // Return the size of your itemsData (invoked by the layout manager) 
    @Override 
    public int getItemCount() { 
     return items.size(); 
    } 
} 

は、私はそれが何らかの形で私は以下の0になるため、その高さを引き起こして、リスト内の最後の項目をタップしcollapseView方法を実行していると思うしかし、私はこれが起こっている理由を理解することができませんでしだ。 誰かが何が間違っているのかを見いだすことを願っています。

答えて

0

あなたはrecycleview項目のOnClilckにご回答のため

@Override 
public void onClick(View view) 
{ 
LayoutParams params = view.getLayoutParams(); 
    if (!large) 
     { 
      params.height = 2 * view.getHeight();  
     } else { 
      params.height = view.getHeight()/2; 
     } 
     large = !large; 
     view.setLayoutParams(params); 
} 
+0

おかげでこれを試すことができますが、私は活動の間で移行する必要はありません。行の高さをフルスクリーンの高さに増やすだけで、ユーザーは引き続き残りのリストをスクロールすることができます。 –