RecyclerView实现顶部悬浮条效果——B枫少

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
 
import com.squareup.picasso.Picasso;
 
public class MainActivity extends AppCompatActivity {
    private RecyclerView mFeedList;
    private RelativeLayout mSuspensionBar;
    private TextView mSuspensionTv;
    private ImageView mSuspensionIv;
    private int mCurrentPosition = 0;
 
    private int mSuspensionHeight;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //顶部布局
        mSuspensionBar = (RelativeLayout) findViewById(R.id.suspension_bar);
        mSuspensionTv = (TextView) findViewById(R.id.tv_nickname);
        mSuspensionIv = (ImageView) findViewById(R.id.iv_avatar);
 
        final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        final FeedAdapter adapter = new FeedAdapter();
 
        mFeedList = (RecyclerView) findViewById(R.id.feed_list);
        mFeedList.setLayoutManager(linearLayoutManager);
        mFeedList.setAdapter(adapter);
        mFeedList.setHasFixedSize(true);
 
        mFeedList.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                //每次滚动状态改变的时候都获取顶部布局的高度
                mSuspensionHeight = mSuspensionBar.getHeight();
            }
 
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                //获取指定位置的item的view
                View view = linearLayoutManager.findViewByPosition(mCurrentPosition + 1);
                if (view == null) return;
                if (view.getTop() <= mSuspensionHeight) {
                    /**
                     * 判断出顶部的顶部布局与上边距的距离,如果<=顶部布局的距离
                     * 那么就让把顶部布局的Y轴距离向上偏移,已达到向上滚动的效果
                     */
                    mSuspensionBar.setY(-(mSuspensionHeight - view.getTop()));
                } else {
                    /**
                     * 直接让顶部布局到顶部
                     */
                    mSuspensionBar.setY(0);
                }
                /**
                 * 获取最上面完全可见的item位置,判断是否是第0位
                 * 如果不是第0位,则让顶部布局置顶
                 */
                if (mCurrentPosition != linearLayoutManager.findFirstVisibleItemPosition()) {
                    mCurrentPosition = linearLayoutManager.findFirstVisibleItemPosition();
                    mSuspensionBar.setY(0);
                    //让顶部布局显示哪个图片
                    updateSuspensionBar();
                }
            }
        });
    }
 
    private void updateSuspensionBar() {
        Picasso.with(MainActivity.this)
                //显示哪个图片
                .load(getAvatarResId(mCurrentPosition))
                .centerInside()
                .fit()
                .into(mSuspensionIv);
        mSuspensionTv.setText("Taeyeon " + mCurrentPosition);
    }
 
    private int getAvatarResId(int position) {
        switch (position % 4) {
            case 0:
                return R.drawable.avatar1;
            case 1:
                return R.drawable.avatar2;
            case 2:
                return R.drawable.avatar3;
            case 3:
                return R.drawable.avatar4;
        }
        return 0;
    }
}

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
 
import com.squareup.picasso.Picasso;
 
public class MainActivity extends AppCompatActivity {
    private RecyclerView mFeedList;
    private RelativeLayout mSuspensionBar;
    private TextView mSuspensionTv;
    private ImageView mSuspensionIv;
    private int mCurrentPosition = 0;
 
    private int mSuspensionHeight;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //顶部布局
        mSuspensionBar = (RelativeLayout) findViewById(R.id.suspension_bar);
        mSuspensionTv = (TextView) findViewById(R.id.tv_nickname);
        mSuspensionIv = (ImageView) findViewById(R.id.iv_avatar);
 
        final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        final FeedAdapter adapter = new FeedAdapter();
 
        mFeedList = (RecyclerView) findViewById(R.id.feed_list);
        mFeedList.setLayoutManager(linearLayoutManager);
        mFeedList.setAdapter(adapter);
        mFeedList.setHasFixedSize(true);
 
        mFeedList.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                //每次滚动状态改变的时候都获取顶部布局的高度
                mSuspensionHeight = mSuspensionBar.getHeight();
            }
 
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                //获取指定位置的item的view
                View view = linearLayoutManager.findViewByPosition(mCurrentPosition + 1);
                if (view == null) return;
                if (view.getTop() <= mSuspensionHeight) {
                    /**
                     * 判断出顶部的顶部布局与上边距的距离,如果<=顶部布局的距离
                     * 那么就让把顶部布局的Y轴距离向上偏移,已达到向上滚动的效果
                     */
                    mSuspensionBar.setY(-(mSuspensionHeight - view.getTop()));
                } else {
                    /**
                     * 直接让顶部布局到顶部
                     */
                    mSuspensionBar.setY(0);
                }
                /**
                 * 获取最上面完全可见的item位置,判断是否是第0位
                 * 如果不是第0位,则让顶部布局置顶
                 */
                if (mCurrentPosition != linearLayoutManager.findFirstVisibleItemPosition()) {
                    mCurrentPosition = linearLayoutManager.findFirstVisibleItemPosition();
                    mSuspensionBar.setY(0);
                    //让顶部布局显示哪个图片
                    updateSuspensionBar();
                }
            }
        });
    }
 
    private void updateSuspensionBar() {
        Picasso.with(MainActivity.this)
                //显示哪个图片
                .load(getAvatarResId(mCurrentPosition))
                .centerInside()
                .fit()
                .into(mSuspensionIv);
        mSuspensionTv.setText("Taeyeon " + mCurrentPosition);
    }
 
    private int getAvatarResId(int position) {
        switch (position % 4) {
            case 0:
                return R.drawable.avatar1;
            case 1:
                return R.drawable.avatar2;
            case 2:
                return R.drawable.avatar3;
            case 3:
                return R.drawable.avatar4;
        }
        return 0;
    }
}

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
 
import com.squareup.picasso.Picasso;
 
public class MainActivity extends AppCompatActivity {
    private RecyclerView mFeedList;
    private RelativeLayout mSuspensionBar;
    private TextView mSuspensionTv;
    private ImageView mSuspensionIv;
    private int mCurrentPosition = 0;
 
    private int mSuspensionHeight;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //顶部布局
        mSuspensionBar = (RelativeLayout) findViewById(R.id.suspension_bar);
        mSuspensionTv = (TextView) findViewById(R.id.tv_nickname);
        mSuspensionIv = (ImageView) findViewById(R.id.iv_avatar);
 
        final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        final FeedAdapter adapter = new FeedAdapter();
 
        mFeedList = (RecyclerView) findViewById(R.id.feed_list);
        mFeedList.setLayoutManager(linearLayoutManager);
        mFeedList.setAdapter(adapter);
        mFeedList.setHasFixedSize(true);
 
        mFeedList.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                //每次滚动状态改变的时候都获取顶部布局的高度
                mSuspensionHeight = mSuspensionBar.getHeight();
            }
 
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                //获取指定位置的item的view
                View view = linearLayoutManager.findViewByPosition(mCurrentPosition + 1);
                if (view == null) return;
                if (view.getTop() <= mSuspensionHeight) {
                    /**
                     * 判断出顶部的顶部布局与上边距的距离,如果<=顶部布局的距离
                     * 那么就让把顶部布局的Y轴距离向上偏移,已达到向上滚动的效果
                     */
                    mSuspensionBar.setY(-(mSuspensionHeight - view.getTop()));
                } else {
                    /**
                     * 直接让顶部布局到顶部
                     */
                    mSuspensionBar.setY(0);
                }
                /**
                 * 获取最上面完全可见的item位置,判断是否是第0位
                 * 如果不是第0位,则让顶部布局置顶
                 */
                if (mCurrentPosition != linearLayoutManager.findFirstVisibleItemPosition()) {
                    mCurrentPosition = linearLayoutManager.findFirstVisibleItemPosition();
                    mSuspensionBar.setY(0);
                    //让顶部布局显示哪个图片
                    updateSuspensionBar();
                }
            }
        });
    }
 
    private void updateSuspensionBar() {
        Picasso.with(MainActivity.this)
                //显示哪个图片
                .load(getAvatarResId(mCurrentPosition))
                .centerInside()
                .fit()
                .into(mSuspensionIv);
        mSuspensionTv.setText("Taeyeon " + mCurrentPosition);
    }
 
    private int getAvatarResId(int position) {
        switch (position % 4) {
            case 0:
                return R.drawable.avatar1;
            case 1:
                return R.drawable.avatar2;
            case 2:
                return R.drawable.avatar3;
            case 3:
                return R.drawable.avatar4;
        }
        return 0;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42046850/article/details/84302989