美文网首页
简单实现悬浮效果的列表

简单实现悬浮效果的列表

作者: GoodWen | 来源:发表于2019-08-23 15:07 被阅读0次

    1,主布局文件 activity_design.xml

    <?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.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolBar"
                android:layout_width="match_parent"
                android:layout_height="?actionBarSize"
                app:layout_scrollFlags="scroll|enterAlways"
                app:title="toolBar" />
    
        </android.support.design.widget.AppBarLayout>
    
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
            <android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@android:color/white"
                android:scrollbars="vertical"
                tools:listitem="@layout/item_feed" />
    
            <RelativeLayout
                android:id="@+id/suspension_bar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/white">
    
                <ImageView
                    android:id="@+id/iv_avatar"
                    android:layout_width="55dp"
                    android:layout_height="55dp"
                    android:padding="8dp"
                    android:src="@drawable/system_logo" />
    
                <TextView
                    android:id="@+id/tv_nickname"
                    android:layout_width="wrap_content"
                    android:layout_height="55dp"
                    android:layout_marginStart="8dp"
                    android:layout_toEndOf="@id/iv_avatar"
                    android:gravity="center_vertical"
                    android:text="NetEase"
                    android:textSize="14sp" />
    
                <View
                    android:id="@+id/top_divider"
                    android:layout_width="match_parent"
                    android:layout_height="0.2dp"
                    android:layout_below="@id/tv_nickname"
                    android:background="#33000000" />
            </RelativeLayout>
        </FrameLayout>
    </android.support.design.widget.CoordinatorLayout>
    

    2,recyclerview item 布局 item_feed.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <!--<com.cyq.materialdesign3.CircleImageView
            android:id="@+id/iv_avatar"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:padding="8dp"
            android:src="@drawable/avatar1" />-->
        <ImageView
            android:id="@+id/iv_avatar"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:padding="8dp"
            android:src="@drawable/system_logo" />
    
        <TextView
            android:id="@+id/tv_nickname"
            android:layout_width="wrap_content"
            android:layout_height="55dp"
            android:layout_marginLeft="8dp"
            android:layout_toRightOf="@id/iv_avatar"
            android:gravity="center_vertical"
            android:text="NetEase"
            android:textSize="14sp" />
    
        <View
            android:id="@+id/top_divider"
            android:layout_width="match_parent"
            android:layout_height="0.2dp"
            android:layout_below="@id/tv_nickname"
            android:background="#33000000" />
    
        <ImageView
            android:id="@+id/iv_content"
            android:layout_width="match_parent"
            android:layout_height="350dp"
            android:layout_below="@id/iv_avatar"
            android:scaleType="centerCrop"
            android:src="@drawable/taeyeon_one" />
    </RelativeLayout>
    

    3,recyclerview adapter FeedAdapter

    public class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.FeedHolder> {
    
        @NonNull
        @Override
        public FeedHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_feed, viewGroup, false);
            return new FeedHolder(view);
        }
    
        @Override
        public void onBindViewHolder(@NonNull FeedHolder viewHolder, int i) {
            //用户头像
            Picasso.with(viewHolder.itemView.getContext())
                    .load(getAvatarResId(i))
                    .centerInside()
                    .fit()
                    .into(viewHolder.mIvAvatar);
            //内容图片
            Picasso.with(viewHolder.itemView.getContext())
                    .load(getContentResId(i))
                    .centerInside()
                    .fit()
                    .into(viewHolder.mIvContent);
            //文本
            viewHolder.mTvNickname.setText("NetEase"+i);
        }
    
        private int getAvatarResId(int position) {
            switch (position % 4) {
                case 0:
                    return R.drawable.system_logo;
                case 1:
                    return R.drawable.system_logo;
                case 2:
                    return R.drawable.system_logo;
                case 3:
                    return R.drawable.system_logo;
    
            }
            return 0;
        }
        private int getContentResId(int posstion) {
            switch (posstion % 4) {
                case 0:
                    return R.drawable.taeyeon_one;
                case 1:
                    return R.drawable.taeyeon_two;
                case 2:
                    return R.drawable.taeyeon_three;
                case 3:
                    return R.drawable.taeyeon_four;
    
            }
            return 0;
        }
    
        @Override
        public int getItemCount() {
            return 100;
        }
    
        public static class FeedHolder extends RecyclerView.ViewHolder {
            ImageView mIvAvatar;
            ImageView mIvContent;
            TextView mTvNickname;
    
            public FeedHolder(@NonNull View itemView) {
                super(itemView);
                mIvAvatar = itemView.findViewById(R.id.iv_avatar);
                mIvContent = itemView.findViewById(R.id.iv_content);
                mTvNickname = itemView.findViewById(R.id.tv_nickname);
            }
        }
    }
    

    4,主activity DesignActivity

    public class DesignActivity extends AppCompatActivity {
    
        private RecyclerView mRecyclerView;
        private FeedAdapter mAdapter;
        private RelativeLayout mSuspensionBar;
        private TextView mSuspensionTv;
        private ImageView mSuspensionIv;
        private int mSuspensionHeight;
        private int mCurrentPosition;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_design);
    
            mSuspensionBar = findViewById(R.id.suspension_bar);
            mSuspensionTv = findViewById(R.id.tv_nickname);
            mSuspensionIv = findViewById(R.id.iv_avatar);
    
            mRecyclerView = findViewById(R.id.recyclerView);
            final LinearLayoutManager manager = new LinearLayoutManager(this);
            mRecyclerView.setLayoutManager(manager);
            mAdapter = new FeedAdapter();
            mRecyclerView.setAdapter(mAdapter);
            mRecyclerView.setHasFixedSize(true);
            mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                    //获取悬浮条的高度
                    mSuspensionHeight = mSuspensionBar.getHeight();
                }
    
                @Override
                public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                    //监听滚动对悬浮条的位置进行调整
                    //找到下一个item
                    View view = manager.findViewByPosition(mCurrentPosition + 1);
                    if (view != null) {//如果view不等于空就去取view距离recyclerview顶端的距离
                        if (view.getTop() <= mSuspensionHeight) {
                            //需要对悬浮条进行移动
                            mSuspensionBar.setY(-(mSuspensionHeight - view.getTop()));//向上移动 所以是负值
                        } else {
                            //保存在原来的位置
                            mSuspensionBar.setY(0);
                        }
                    }
                    //更改悬浮条上的数据
                    if (mCurrentPosition != manager.findFirstVisibleItemPosition()) {
                        mCurrentPosition = manager.findFirstVisibleItemPosition();
                        updateSuspensionBar();
                    }
                }
            });
            updateSuspensionBar();
        }
    
        /**
         * 更新试图方法
         */
        private void updateSuspensionBar() {
            //用户头像
            Picasso.with(this)
                    .load(getAvatarResId(mCurrentPosition))
                    .centerInside()
                    .fit()
                    .into(mSuspensionIv);
    
            //文本
            mSuspensionTv.setText("NetEase" + mCurrentPosition);
        }
    
        private int getAvatarResId(int position) {
            switch (position % 4) {
                case 0:
                    return R.drawable.system_logo;
                case 1:
                    return R.drawable.system_logo;
                case 2:
                    return R.drawable.system_logo;
                case 3:
                    return R.drawable.system_logo;
    
            }
            return 0;
        }
    
        private int getContentResId(int posstion) {
            switch (posstion % 4) {
                case 0:
                    return R.drawable.taeyeon_one;
                case 1:
                    return R.drawable.taeyeon_two;
                case 2:
                    return R.drawable.taeyeon_three;
                case 3:
                    return R.drawable.taeyeon_four;
    
            }
            return 0;
        }
    }
    

    相关文章

      网友评论

          本文标题:简单实现悬浮效果的列表

          本文链接:https://www.haomeiwen.com/subject/irctectx.html