大佬教程收集整理的这篇文章主要介绍了Android动画回收视图,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
它应该如何表现:
>用户点击事件>视图扩展到全屏
>用户点击展开的事件>视图折叠回原始大小
>用户在展开另一个事件时点击事件>展开事件设置为原始高度.已点击事件扩展为全屏
目前的行为:
>用户点击事件>除了列表中的最后一项外,所有视图都可以正确扩展
>用户点击扩展事件>查看折叠但不动画
>用户在展开另一个事件时点击事件>展开的事件折叠和tapped事件正确扩展
>用户点击列表中的最后一个事件>事件消失(可能会将其大小减小到0以下)
我知道这可能与recyclelerview在屏幕外时重用其视图的方式有关.为了解决这个问题,我通过eventId检查tapped事件的位置,而不是列表中的位置,但这仍然留下了我上面谈到的问题.
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,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@R_772_10374@,"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(); } }
我认为当我点击列表中的最后一项时,它以某种方式运行collapseView方法,导致其高度低于0.但我无法弄清楚为什么会发生这种情况.
我希望有人能够发现这里的错误.
以上是大佬教程为你收集整理的Android动画回收视图全部内容,希望文章能够帮你解决Android动画回收视图所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。