Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android动画回收视图大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我创建了一个带有“事件”列表的recyclerview.这适用于低于5的事件列表.但是当我在列表中获得6个或更多事件时,最后一个事件在点击时不会扩展,而是消失.结束动画也停止使用列表中的6个以上事件.

它应该如何表现:

>用户点击事件>视图扩展到全屏
>用户点击展开的事件>视图折叠回原始大小
>用户在展开另一个事件时点击事件>展开事件设置为原始高度.已点击事件扩展为全

目前的行为:

>用户点击事件>除了列表中的最后一项外,所有视图都可以正确扩展
>用户点击扩展事件>查看折叠但不动画
>用户在展开另一个事件时点击事件>展开的事件折叠和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.但我无法弄清楚为什么会发生这种情况.
我希望有人能够发现这里的错误.

解决方法

你可以在的onClilck中尝试使用recycleview Item

@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);
}

大佬总结

以上是大佬教程为你收集整理的Android动画回收视图全部内容,希望文章能够帮你解决Android动画回收视图所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。