如何在回收站视图中隐藏特定行的视图?

时间:2016-07-21 10:38:17

标签: android android-recyclerview android-adapter

我有一个使用回收站视图的列表来显示列表。问题是我在活动和回收者视图中有一个工厂。此外,我在右侧点击三个点添加了一个弹出菜单。但我无法访问列表最后一行的三个点,它隐藏在fab的后面。就像这样:enter image description here

为了避免这种情况,我想在列表的最后一个索引处添加一个空行。但它显示了轮廓图像和水平视图。我想隐藏这个。我该怎么做?

主要活动布局:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:context="com.example.siddhi.meavita.Activities.EventsListActivity">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

        </android.support.design.widget.AppBarLayout>

        <include layout="@layout/content_events_list" />
        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_margin="@dimen/fab_margin"
            android:src="@drawable/ic_add_white_36dp"
            android:background="@color/colorAccent"/>

    </android.support.design.widget.CoordinatorLayout>


        <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/parentPanel"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:context="com.example.siddhi.meavita.Activities.EventsListActivity"
        tools:showIn="@layout/activity_events_list">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:scrollbars="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center_horizontal|bottom"
            android:paddingTop="05dp"
            android:paddingBottom="10dp" />
    </RelativeLayout>

活动卡片布局:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_marginTop="05dp">

        <com.github.siyamed.shapeimageview.CircularImageView
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:src="@drawable/ic_person_black_48dp"
            app:siBorderWidth="1dp"
            app:siBorderColor="@android:color/darker_gray"
            android:layout_marginLeft="20dp"
            android:id="@+id/eventsIcon"
            android:layout_marginTop="05dp"
            android:layout_marginBottom="05dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Event name"
            android:id="@+id/scheduleName"
            android:textSize="14sp"
            android:layout_alignTop="@+id/eventsIcon"
            android:layout_toRightOf="@+id/eventsIcon"
            android:layout_toEndOf="@+id/eventsIcon"
            android:layout_marginLeft="10dp"
            android:layout_marginStart="10dp"
            android:textColor="@android:color/black"
            android:textStyle="bold" />
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_more_vert_black_24dp"
            android:id="@+id/more"
            android:layout_centerInParent="true"
            android:layout_alignParentEnd="true"
            android:layout_marginRight="20dp" />
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/switch_thumb_normal_material_light"
            android:layout_alignBottom="@+id/eventsIcon"
            android:layout_alignParentBottom="true"
            android:layout_marginRight="20dp"
            android:layout_toEndOf="@+id/eventsIcon"
            android:layout_below="@+id/eventsIcon"
            android:layout_alignLeft="@+id/scheduleName"
            android:layout_alignStart="@+id/scheduleName"
            android:id="@+id/view4"></View>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="(Type of event)"
            android:id="@+id/eventType"
            android:layout_centerVertical="true"
            android:layout_alignLeft="@+id/scheduleName"
            android:layout_alignStart="@+id/scheduleName"
            android:textSize="12sp"
            android:textColor="@android:color/black" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Date and time"
            android:id="@+id/eventDateTime"
            android:layout_below="@+id/eventType"
            android:layout_alignLeft="@+id/view4"
            android:layout_alignStart="@+id/view4"
            android:textSize="12sp"
            android:textColor="@android:color/black"
            android:layout_marginTop="02dp" />
    </RelativeLayout>

</LinearLayout>

适配器:

       public class EventListAdapter extends RecyclerView.Adapter<EventListAdapter.MyViewHolder>{

        private final OnItemClickListener listener;
        private ArrayList<Event> eventsList;
        int status;
        Context context;

        public interface OnItemClickListener {
            void onItemClick(Event item);
        }

        public class MyViewHolder extends RecyclerView.ViewHolder {
            public TextView eventName,eventType,eventDateTime;
            public PopupMenu popup;
            public ImageView more;
            public View horizontalView;

            public com.github.siyamed.shapeimageview.CircularImageView profileImage;


            public MyViewHolder(View view) {
                super(view);
                eventName = (TextView) view.findViewById(R.id.scheduleName);
                eventType = (TextView) view.findViewById(R.id.eventType);
                eventDateTime = (TextView) view.findViewById(R.id.eventDateTime);
                more = (ImageView) itemView.findViewById(R.id.more);
                horizontalView = (View) itemView.findViewById(R.id.view4);
                popup = new PopupMenu(context, more);
                profileImage = (com.github.siyamed.shapeimageview.CircularImageView) itemView.findViewById(R.id.eventsIcon);

                MenuInflater inflate = popup.getMenuInflater();
                inflate.inflate(R.menu.pop_up_menu,popup.getMenu());


                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {

                    @Override
                    public boolean onMenuItemClick(final MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.edit:
                                // do what you need.
                                int pos = getLayoutPosition();
                                Event currentItem= eventsList.get(pos);
                                // update(pos);

                             //   ((CheckListActivity)context).updateCheckList(context,currentItem);

                                Toast.makeText(context, "Edit", Toast.LENGTH_SHORT).show();
                                break;
                            case R.id.delete:
                                // do what you need .
                                int pos1 = getLayoutPosition();
                                Event currentItem1= eventsList.get(pos1);

                                ((EventsListActivity)context).deleteEvent(context,currentItem1);

                                Toast.makeText(context, "Delete", Toast.LENGTH_SHORT).show();
                                break;
                            default:
                                return false;
                        }
                        return false;
                    }
                });

            }

            public void bind(final Event item, final OnItemClickListener listener) {

                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override public void onClick(View v) {
                        listener.onItemClick(item);
                    }
                });
            }
        }


        public EventListAdapter(ArrayList<Event> eventsList,Context context,OnItemClickListener listener) {
            this.eventsList = eventsList;
            this.listener = listener;
            this.context = context;
        }

        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View itemView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.event_card, parent, false);

            return new MyViewHolder(itemView);
        }

        @Override
        public void onBindViewHolder(final MyViewHolder holder, int position) {

            Event events = eventsList.get(position);
            holder.eventName.setText(events.getEventName());
            holder.eventType.setText(events.getEventType());
            holder.eventDateTime.setText(events.getEventDate() + "," + events.getEventTime());

            holder.bind(eventsList.get(position), listener);


            holder.more.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    Toast.makeText(context, "More", Toast.LENGTH_SHORT).show();
                    holder.popup.show();
                }
            });



        }

        @Override
        public int getItemCount() {
            return eventsList.size();
        }
    }

怎么做?谢谢..

2 个答案:

答案 0 :(得分:1)

您可以在Recyclerview中添加填充,更容易:

android:clipToPadding="false"
android:paddingBottom="80dp"

否则你可以检查你是否在onBindViewHolder的最后位置:

if (position == eventsList.size() -1){
  holder.profileImage.setVisibility(View.INVISIBLE)
}else{
  holder.profileImage.setVisibility(View.VISIBLE)
}

答案 1 :(得分:0)

向“浮动操作”按钮添加自定义布局行为:实现此行为将确保在滚动recyclerview时隐藏FAB。

<android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="56dp"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:src="@drawable/icon_search"
        app:backgroundTint="#0F9D58"
        app:fabSize="normal"
        app:layout_anchor="@id/bottomCartFrameLayout"
        app:layout_anchorGravity="bottom|right|end"
        app:layout_behavior="yourpackagename.ScrollAwareFABBehavior"
        app:layout_collapseMode="parallax"
        /> 

ScrollAwareFABBehavior类:

import android.content.Context;
import android.os.Build;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPropertyAnimatorListener;
import android.support.v4.view.animation.FastOutSlowInInterpolator;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;

import yourpackagename.R;



public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior {
    private static final Interpolator INTERPOLATOR = new FastOutSlowInInterpolator();
    private boolean mIsAnimatingOut = false;

    public ScrollAwareFABBehavior(Context context, AttributeSet attrs) {
        super();
    }

    @Override
    public boolean onStartNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child,
                                       final View directTargetChild, final View target, final int nestedScrollAxes) {
        // Ensure we react to vertical scrolling
        return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL
                || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
    }

    @Override
    public void onNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child,
                               final View target, final int dxConsumed, final int dyConsumed,
                               final int dxUnconsumed, final int dyUnconsumed) {
        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
        if (dyConsumed > 0 && !this.mIsAnimatingOut && child.getVisibility() == View.VISIBLE) {
            // User scrolled down and the FAB is currently visible -> hide the FAB
            animateOut(child);
        } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) {
            // User scrolled up and the FAB is currently not visible -> show the FAB
            animateIn(child);
        }
    }

    // Same animation that FloatingActionButton.Behavior uses to hide the FAB when the AppBarLayout exits
    private void animateOut(final FloatingActionButton button) {
        if (Build.VERSION.SDK_INT >= 14) {
            ViewCompat.animate(button).scaleX(0.0F).scaleY(0.0F).alpha(0.0F).setInterpolator(INTERPOLATOR).withLayer()
                    .setListener(new ViewPropertyAnimatorListener() {
                        public void onAnimationStart(View view) {
                            ScrollAwareFABBehavior.this.mIsAnimatingOut = true;
                        }

                        public void onAnimationCancel(View view) {
                            ScrollAwareFABBehavior.this.mIsAnimatingOut = false;
                        }

                        public void onAnimationEnd(View view) {
                            ScrollAwareFABBehavior.this.mIsAnimatingOut = false;
                            view.setVisibility(View.GONE);
                        }
                    }).start();
        } else {
            Animation anim = AnimationUtils.loadAnimation(button.getContext(), R.anim.fab_out);
            anim.setInterpolator(INTERPOLATOR);
            anim.setDuration(200L);
            anim.setAnimationListener(new Animation.AnimationListener() {
                public void onAnimationStart(Animation animation) {
                    ScrollAwareFABBehavior.this.mIsAnimatingOut = true;
                }

                public void onAnimationEnd(Animation animation) {
                    ScrollAwareFABBehavior.this.mIsAnimatingOut = false;
                    button.setVisibility(View.GONE);
                }

                @Override
                public void onAnimationRepeat(final Animation animation) {
                }
            });
            button.startAnimation(anim);
        }
    }

    // Same animation that FloatingActionButton.Behavior uses to show the FAB when the AppBarLayout enters
    private void animateIn(FloatingActionButton button) {
        button.setVisibility(View.VISIBLE);
        if (Build.VERSION.SDK_INT >= 14) {
            ViewCompat.animate(button).scaleX(1.0F).scaleY(1.0F).alpha(1.0F)
                    .setInterpolator(INTERPOLATOR).withLayer().setListener(null)
                    .start();
        } else {
            Animation anim = AnimationUtils.loadAnimation(button.getContext(), R.anim.fab_in);
            anim.setDuration(200L);
            anim.setInterpolator(INTERPOLATOR);
            button.startAnimation(anim);
        }
    }
}

整个布局文件供您参考:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <FrameLayout
        android:id="@+id/bottomCartFrameLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:behavior_hideable="false"
        app:layout_behavior="@string/bottom_sheet_behavior">

        <include layout="@layout/bottom_sheet_content_view"
            />
    </FrameLayout>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="56dp"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:src="@drawable/icon_search"
        app:backgroundTint="#0F9D58"
        app:fabSize="normal"
        app:layout_anchor="@id/bottomCartFrameLayout"
        app:layout_anchorGravity="bottom|right|end"
        app:layout_behavior="yourpackagename.ScrollAwareFABBehavior"
        app:layout_collapseMode="parallax"
        />

</android.support.design.widget.CoordinatorLayout>

实现FAB滚动行为的教程:

https://guides.codepath.com/android/floating-action-buttons

如果有帮助,请告诉我。

相关问题