android 使用RecyclerView实现首项左右滑动,剩余项图片自适应

  实际项目中要实现这样的效果,界面中开始的位置实现轮播图的效果,然后下面紧跟着就是一张张的图片,而且图片的大小不一定.并且是依次排列下来的.
效果图
  首先想到的就是使用RecyclerView,然后第0项使用ViewPager的方式实现左右滑动,并且但是小圆点的导航图,从第一项开始使用ImageView使图片依次排列下来.OK方案确定下来后没开始动手写代码:

一:先把布局文件写出来:

<RelativeLayout
        android:id="@+id/e_custom_merchandise_activity_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/activity_recyclerview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />
</RelativeLayout

既然第0项使用的ViewPager,要把它的界面布局也要写出来:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <android.support.v4.view.ViewPager
            android:id="@+id/e_custom_merchandise_vp_iamge"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/colorPrimary"/>
        <LinearLayout
            android:id="@+id/e_custom_merchandise_indicator"
            android:layout_width="wrap_content"
            android:layout_height="20dp"
            android:layout_gravity="bottom|right"
            android:layout_marginBottom="5dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="5dp"
            android:gravity="center"
            android:orientation="horizontal"/>
    </FrameLayout>
</LinearLayout>

其余的Item布局,其实就是一个ImageView

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical">
    <ImageView
        android:id="@+id/recyclerview_item_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"
        tools:src="@drawable/watermark"/>
</RelativeLayout>

二:然后就是在Activity中初始化

private EcommerceDetailDisplayAdapter mMyAdapter;


private void initView() {
        mRecyclerView = (RecyclerView) findViewById(R.id.activity_recyclerview);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(CustomProductActivity.this, LinearLayoutManager.VERTICAL, false));//竖直放置
        mMyAdapter = new EcommerceDetailDisplayAdapter(CustomProductActivity.this);
        mMyAdapter.setShowHeaderList(headShowList);
        mMyAdapter.setShowDetailList(itemShowList);
        mRecyclerView.setAdapter(mMyAdapter);
        mRecyclerView.addItemDecoration(new SpaceItemDecoration(4));
    }

最重要的Adapter:

import android.content.Context;
import android.graphics.Bitmap;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.manboker.headportrait.R;

import java.util.ArrayList;

/**
 * Author: aaa
 * Date: 2016/12/12 20:22.
 */
public class EcommerceDetailDisplayAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context mContext;
    private static final int TYPE_HEADER = 0;//列表头
    private static final int TYPE_ITEM = 1;//列表项

    private ArrayList<Bitmap> showHeaderList;//第一项ViewPager中的图片
    private ArrayList<Bitmap> showDetailList;//剩余的图片

    private int mScreenWidth;//屏幕的宽度

    public EcommerceDetailDisplayAdapter(Context context) {
        mContext = context;
        showHeaderList = new ArrayList<Bitmap>();
        showDetailList = new ArrayList<Bitmap>();

        WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        mScreenWidth = wm.getDefaultDisplay().getWidth();
    }

    public void setShowHeaderList(ArrayList<Bitmap> headerBitmapList) {
        showHeaderList = headerBitmapList;
        notifyDataSetChanged();
    }

    public void setShowDetailList(ArrayList<Bitmap> showDetailList) {
        this.showDetailList = showDetailList;
        notifyDataSetChanged();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //理论上应该把最可能返回的 TYPE 放在前面
        View view = null;

        //头部返回 ViewPager 实现的轮播图片
        if (viewType == TYPE_HEADER) {
            view = LayoutInflater.from(mContext).inflate(R.layout.e_custom_merchandise_recyclerview_header, parent, false);
            HeaderViewHolder headerViewHolder = new HeaderViewHolder(view);
            //创建的时候绑定Adapter,防止RecyclerView从底部滑到上部的时候,重复刷新
            EcommerceHeaderAdapter imageAdapter = new EcommerceHeaderAdapter(mContext, showHeaderList);
            headerViewHolder.mViewPager.setAdapter(imageAdapter);
            headerViewHolder.mViewPager.addOnPageChangeListener(new HeaderChangeListener());//设置滑动监听
            createTipsCircle(headerViewHolder.mLLIndicator);//设置底部导航圆点
            return headerViewHolder;
        }
        if (viewType == TYPE_ITEM) {
            view = LayoutInflater.from(mContext).inflate(R.layout.e_custom_merchandise_recyclerview_item, parent, false);
            return new ItemViewHolder(view);
        }

        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof HeaderViewHolder) {

        } else if (holder instanceof ItemViewHolder) {
            ItemViewHolder itemViewHolder = (ItemViewHolder) holder;

            ViewGroup.LayoutParams layoutParams = itemViewHolder.mItemImageView.getLayoutParams();
            layoutParams.width = mScreenWidth;
            layoutParams.height = ViewPager.LayoutParams.WRAP_CONTENT;
            itemViewHolder.mItemImageView.setLayoutParams(layoutParams);
            itemViewHolder.mItemImageView.setMaxWidth(mScreenWidth);
            itemViewHolder.mItemImageView.setMaxHeight(mScreenWidth * 4);
            itemViewHolder.mItemImageView.setImageBitmap(showDetailList.get(position - 1));
        }
    }

    @Override
    public int getItemCount() {
        return showDetailList.size() + 1;//剩余图片+第一列的图片
    }

    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return TYPE_HEADER;
        } else {
            return TYPE_ITEM;
        }
    }

    class HeaderViewHolder extends RecyclerView.ViewHolder {

        private ViewPager mViewPager;
        private LinearLayout mLLIndicator;

        public HeaderViewHolder(View itemView) {
            super(itemView);
            mViewPager = (ViewPager) itemView.findViewById(R.id.e_custom_merchandise_vp_iamge);
            mLLIndicator = (LinearLayout) itemView.findViewById(R.id.e_custom_merchandise_indicator);
        }
    }

    class ItemViewHolder extends RecyclerView.ViewHolder {

        public ImageView mItemImageView;

        public ItemViewHolder(View itemView) {
            super(itemView);
            mItemImageView = (ImageView) itemView.findViewById(R.id.e_custom_merchandise_recyclerview_item_image);
        }
    }

    ImageView[] mCircleImages;//底部导航栏的小圆点数组
    //设置当前 第几个图片 被选中
    private int currentIndex = 0;

    //创建底部的小圆点导航栏
    private void createTipsCircle(LinearLayout llTips) {

        mCircleImages = new ImageView[showHeaderList.size()];
        for (int i = 0; i < mCircleImages.length; i++) {
            ImageView imageView = new ImageView(mContext);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(10, 10);
            params.setMargins(5, 0, 5, 0);
            imageView.setLayoutParams(params);
            if (i == 0) {
                imageView.setBackgroundResource(R.drawable.indicator_focused);
            } else {
                imageView.setBackgroundResource(R.drawable.indicator);
            }
            mCircleImages[i] = imageView;
            //把指示作用的原点图片加入底部的视图中
            llTips.addView(mCircleImages[i]);
        }
    }

    private class HeaderChangeListener implements ViewPager.OnPageChangeListener {

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            // 一定几个图片,几个圆点,但注意是从0开始的
            int total = mCircleImages.length;
            for (int j = 0; j < total; j++) {
                if (j == position) {
                    mCircleImages[j].setBackgroundResource(R.drawable.indicator_focused);
                } else {
                    mCircleImages[j].setBackgroundResource(R.drawable.indicator);
                }
            }
            //设置全局变量,currentIndex为选中图标的 index
            currentIndex = position;
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    }
}

还有就是ViewPager的adapter:

import android.content.Context;
import android.graphics.Bitmap;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import java.util.ArrayList;

/**
 * Author: aaa
 * Date: 2016/12/12 21:23.
 */
public class EcommerceHeaderAdapter extends PagerAdapter {

    private Context mContext;
    private ArrayList<Bitmap> mBitmaps;
    private ArrayList<ImageView> mImageViews;

    public EcommerceHeaderAdapter(Context context, ArrayList<Bitmap> bitmaps) {
        mContext = context;
        mBitmaps = new ArrayList<Bitmap>();
        mImageViews = new ArrayList<ImageView>();

        mBitmaps = bitmaps;
        init();
    }

    private void init() {
        for (int i = 0; i < getCount(); i++) {
            ImageView imageView = new ImageView(mContext);

            imageView.setImageBitmap(mBitmaps.get(i));
            mImageViews.add(imageView);
        }
    }

    @Override
    public int getCount() {
        return mBitmaps.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        // 将当前位置的View移除
        container.removeView(mImageViews.get(position));
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {  //这个方法用来实例化页卡
        container.addView(mImageViews.get(position), 0);
        return mImageViews.get(position);
    }
}

三:注意
1.创建导航点的代码:

createTipsCircle(headerViewHolder.mLLIndicator);//设置底部导航圆点

一定要放到onCreateViewHolder(ViewGroup parent, int viewType)这个方法中.目的是指创建一次.

2.图片显示的时候属性值:

android:adjustViewBounds="true"
android:scaleType="fitXY"

一定要加上这两句属性,同时代码,也要加上:
itemViewHolder.mItemImageView.setMaxWidth(mScreenWidth);
itemViewHolder.mItemImageView.setMaxHeight(mScreenWidth * 4);
否则达不到想要的效果.

3.要相信自己,不停的测试各种方案,最终会达到目的的.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现九宫格横向左右滑动的功能,可以使用 RecyclerView 和 GridLayoutManager 来实现。以下是具体步骤: 1. 在布局文件中,添加 RecyclerView 控件: ```xml <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="horizontal" /> ``` 2. 在代码中,初始化 RecyclerView 和 GridLayoutManager,并设置相关属性: ```java RecyclerView recyclerView = findViewById(R.id.recycler_view); GridLayoutManager layoutManager = new GridLayoutManager(this, 3); // 设置列数为3 layoutManager.setOrientation(RecyclerView.HORIZONTAL); // 设置水平滚动 recyclerView.setLayoutManager(layoutManager); int spacing = getResources().getDimensionPixelSize(R.dimen.grid_spacing); // 设置item之间的间距 recyclerView.addItemDecoration(new GridSpacingItemDecoration(3, spacing, true)); // 通过自定义ItemDecoration来实现 ``` 其中,GridSpacingItemDecoration 是自定义的一个 RecyclerView.ItemDecoration,用来设置 item 之间的间距,具体实现如下: ```java public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration { private int spanCount; private int spacing; private boolean includeEdge; public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) { this.spanCount = spanCount; this.spacing = spacing; this.includeEdge = includeEdge; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int position = parent.getChildAdapterPosition(view); // item position int column = position % spanCount; // item column if (includeEdge) { outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing) outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing) if (position < spanCount) { // top edge outRect.top = spacing; } outRect.bottom = spacing; // item bottom } else { outRect.left = column * spacing / spanCount; // column * ((1f / spanCount) * spacing) outRect.right = spacing - (column + 1) * spacing / spanCount; // spacing - (column + 1) * ((1f / spanCount) * spacing) if (position >= spanCount) { outRect.top = spacing; // item top } } } } ``` 3. 创建 RecyclerView.Adapter 和 RecyclerView.ViewHolder,并在 onBindViewHolder() 方法中设置 item 的内容: ```java public class GridAdapter extends RecyclerView.Adapter<GridAdapter.GridViewHolder> { private List<Integer> dataList; // 数据源 public GridAdapter(List<Integer> dataList) { this.dataList = dataList; } @NonNull @Override public GridViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_grid, parent, false); return new GridViewHolder(view); } @Override public void onBindViewHolder(@NonNull GridViewHolder holder, int position) { holder.imageView.setImageResource(dataList.get(position)); // 设置图片资源 } @Override public int getItemCount() { return dataList.size(); } static class GridViewHolder extends RecyclerView.ViewHolder { ImageView imageView; GridViewHolder(View itemView) { super(itemView); imageView = itemView.findViewById(R.id.image_view); } } } ``` 4. 最后在 Activity 中设置 RecyclerView 的 adapter: ```java List<Integer> dataList = new ArrayList<>(); // 数据源 dataList.add(R.drawable.pic1); dataList.add(R.drawable.pic2); dataList.add(R.drawable.pic3); dataList.add(R.drawable.pic4); dataList.add(R.drawable.pic5); dataList.add(R.drawable.pic6); dataList.add(R.drawable.pic7); dataList.add(R.drawable.pic8); dataList.add(R.drawable.pic9); GridAdapter adapter = new GridAdapter(dataList); recyclerView.setAdapter(adapter); ``` 这样就可以实现九宫格横向左右滑动的效果了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值