Android通过PagerSnapHelper改造RecyclerView成“ViewPager”

版权声明:本文为Zhang Phil原创文章,请不要转载! https://blog.csdn.net/zhangphil/article/details/82837298

Android通过PagerSnapHelper改造RecyclerView成“ViewPager”


最新Android平台针对RecyclerView引入一个辅助类PagerSnapHelper,PagerSnapHelper可以把一个普通的RecyclerView改造成ViewPager,每一个RecyclerView的子item在翻动时候,像ViewPager一样。
如代码:

package zhangphil.test;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.PagerSnapHelper;
import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

public class RVActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView mRecyclerView = findViewById(R.id.recycler_view);

        LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
        mLayoutManager.setOrientation(LinearLayout.HORIZONTAL);
        mRecyclerView.setLayoutManager(mLayoutManager);

        PagerSnapHelper mPagerSnapHelper = new PagerSnapHelper();
        mPagerSnapHelper.attachToRecyclerView(mRecyclerView);

        RecyclerView.Adapter mAdapter = new MyAdapter();
        mRecyclerView.setAdapter(mAdapter);
    }

    private class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
        public MyAdapter() {
            super();
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View view = LayoutInflater.from(getApplicationContext()).inflate(android.R.layout.simple_list_item_2, null);
            ViewHolder holder = new ViewHolder(view);
            return holder;
        }

        @Override
        public void onBindViewHolder(ViewHolder viewHolder, int i) {
            viewHolder.text1.setText(String.valueOf(i));
            viewHolder.text2.setText("pos:" + i);

            int n = i % 2;
            int color = n == 0 ? Color.DKGRAY : Color.LTGRAY;

            viewHolder.itemView.setBackgroundColor(color);
        }

        @Override
        public int getItemCount() {
            return 20;
        }

        public class ViewHolder extends RecyclerView.ViewHolder {
            public TextView text1;
            public TextView text2;

            public ViewHolder(View itemView) {
                super(itemView);

                float[] size = getDeviceDisplaySize(getApplicationContext());
                itemView.setMinimumWidth((int) size[0]);

                text1 = itemView.findViewById(android.R.id.text1);
                text1.setTextColor(Color.RED);
                text1.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 160);

                text2 = itemView.findViewById(android.R.id.text2);
                text2.setTextColor(Color.BLUE);
            }
        }
    }

    public static float[] getDeviceDisplaySize(Context context) {
        Resources resources = context.getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        int width = dm.widthPixels;
        int height = dm.heightPixels;

        float[] size = new float[2];
        size[0] = width;
        size[1] = height;

        return size;
    }
}


本例特意把RecyclerView设置成水平方向,并且把每一个子元素的宽度设置成和手机设备屏幕宽度一样的值,以达到和ViewPager相同的效果。
运行如图:

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/82837298