1. 程式人生 > >RecyclerView 替換 Scrollview,gridview 組合。

RecyclerView 替換 Scrollview,gridview 組合。

至於為何要這麼做,無需多言,相信大家深有體會。

先上主佈局檔案以及item佈局檔案,

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.jingchen.pulltorefresh.PullToRefreshLayout
        android:id="@+id/refresh_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@mipmap/icon_11_11">

        <com.jingchen.pulltorefresh.PullableRecyclerView
            android:id="@+id/homeRecommend_RecyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#f4f5f9"
            android:horizontalSpacing="10dp"
            android:numColumns="2"
            android:verticalSpacing="10dp"/>

    </com.jingchen.pulltorefresh.PullToRefreshLayout>

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root_RelativeLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#FFFFFF">

    <ImageView
        android:id="@+id/goods_ImageView"
        android:layout_width="175dp"
        android:layout_height="175dp"
        android:layout_centerHorizontal="true"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:src="@mipmap/goodsimagetest"/>

    <TextView
        android:id="@+id/goodsname_TextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/goods_ImageView"
        android:layout_centerHorizontal="true"
        android:ellipsize="end"
        android:maxEms="14"
        android:singleLine="true"
        android:text="戀白茹時尚兩件套裝棉麻牛仔裙韓版女裝衣服春秋呵呵呵呵呵呵"
        android:textColor="#000000"
        android:textSize="14dp"/>

    <TextView
        android:id="@+id/goodstrueprice_TextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@id/goodsname_TextView"
        android:layout_below="@id/goodsname_TextView"
        android:layout_marginTop="5dp"
        android:text="¥198"
        android:textColor="#ff00"
        android:textSize="17dp"/>

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@id/goodstrueprice_TextView"
        android:layout_toRightOf="@id/goodstrueprice_TextView">

        <TextView
            android:id="@+id/goodsoldprice_TextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@id/goodsname_TextView"
            android:text="¥498"
            android:textColor="#999999"
            android:textSize="12dp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="2px"
            android:layout_gravity="center_vertical"
            android:background="#999999"/>

    </FrameLayout>

</RelativeLayout>
切記,item的根佈局的高度一定設定為“wrap_content”,否則,會出現item的高度和螢幕高度一樣。

Fragment程式碼片段:

pullToRefreshLayout = (PullToRefreshLayout) findViewById(R.id.refresh_view);
        homeRecommend_RecyclerView = (PullableRecyclerView) pullToRefreshLayout.getPullableView();
homeRecommendGoodsRecyclerViewAdapter = new HomeRecommendGoodsRecyclerViewAdapter(context, homeRecommend_RecyclerView, list1, homeRecommend_RecyclerView_HeaderView);
homeRecommend_RecyclerView_HeaderView為頭佈局,隨意寫。
設定recyclerView為gridview模式,並重寫setSpanSizeLookup函式解決頭佈局只佔據gridview第一個item位置的問題
final GridLayoutManager gridLayoutManager = new GridLayoutManager(context, 2);
//        gridLayoutManager.setAutoMeasureEnabled(false);
        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup()
        {
            @Override
            public int getSpanSize(int position)
            {
                return homeRecommendGoodsRecyclerViewAdapter.isHeader(position) ? gridLayoutManager.getSpanCount() : 1;
            }
        });
        homeRecommend_RecyclerView.setLayoutManager(gridLayoutManager);
//        homeRecommend_RecyclerView.setHasFixedSize(false);
        homeRecommend_RecyclerView.setAdapter(homeRecommendGoodsRecyclerViewAdapter);



Adapter完整程式碼:
package com.maoyudun.alimamaproject.adapter;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Build;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.alibaba.baichuan.android.trade.AlibcTrade;
import com.alibaba.baichuan.android.trade.callback.AlibcTradeCallback;
import com.alibaba.baichuan.android.trade.constants.AlibcConstants;
import com.alibaba.baichuan.android.trade.model.AlibcShowParams;
import com.alibaba.baichuan.android.trade.model.AlibcTaokeParams;
import com.alibaba.baichuan.android.trade.model.OpenType;
import com.alibaba.baichuan.android.trade.model.TradeResult;
import com.alibaba.baichuan.android.trade.page.AlibcBasePage;
import com.alibaba.baichuan.android.trade.page.AlibcDetailPage;
import com.jingchen.pulltorefresh.WrapRecyclerView;
import com.maoyudun.alimamaproject.R;
import com.maoyudun.alimamaproject.bean.Aitaobao_item;
import com.maoyudun.alimamaproject.bean.HomeRecommendGoodsInfo;
import com.maoyudun.alimamaproject.util.DataUtilImpl;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2016/10/20.
 * 推薦adapater
 */
public class HomeRecommendGoodsRecyclerViewAdapter extends BaseAutoLoadMoreAdapter<HomeRecommendGoodsInfo>
{
    /**
     * item型別
     * */
    private static final int ITEM_VIEW_TYPE_HEADER = 0;
    private static final int ITEM_VIEW_TYPE_ITEM = 1;
    /**
     * 頭佈局
     * */
    private View header;

    private ArrayList<HomeRecommendGoodsInfo> mDatas;
    private Context context;
    private int layoutID = R.layout.homerecommendgoodsgridviewitem;
    private LayoutInflater mInflater;
    private ImageLoader imageLoader = ImageLoader.getInstance();
    private DataUtilImpl dataUtilImpl = DataUtilImpl.getInstance();

    public HomeRecommendGoodsRecyclerViewAdapter(Context context, WrapRecyclerView recyclerView, ArrayList<HomeRecommendGoodsInfo> data, View header)
    {
        super(context, recyclerView, data);
        this.mDatas = data;
        this.context = context;
        this.mInflater = LayoutInflater.from(context);
        this.header = header;
    }

    @Override
    public BaseViewHolder onCreateBaseViewHolder(ViewGroup parent, int viewType)
    {
        if (viewType == ITEM_VIEW_TYPE_HEADER)
        {
            return new BaseViewHolder(header);
        }
        else
        {
            return new ViewHolder(mInflater.inflate(layoutID, parent, false));
        }
    }

    @Override
    public int getItemHeight(RecyclerView.ViewHolder holder)
    {
        holder.itemView.measure(0, 0);
        return holder.itemView.getMeasuredHeight();
    }

    @Override
    public void onBindBaseViewHolder(BaseViewHolder holder, final int position)
    {
        /**
         * item型別為頭佈局,直接返回頭佈局,否則解析item進行資料填充
         * */
        if (isHeader(position))
        {
            return;
        }
        else
        {
            final ViewHolder finalViewHolder = (ViewHolder) holder;
            /**
             * 因為新增頭部局而把item數量加一,所以獲取資料時,position 應該減一
             * */
//            imageLoader.loadImage(mDatas.get(position - 1).getImageurl(), new ImageLoadingListener()
//            {
//                @Override
//                public void onLoadingStarted(String imageUri, View view)
//                {}
//
//                @Override
//                public void onLoadingFailed(String imageUri, View view, FailReason failReason)
//                {}
//
//                @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
//                @Override
//                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage)
//                {
//                    if(!loadedImage.isRecycled())
//                    {
//                        System.out.println("i交話費機會股價大幅估計是都不能不給哦就關機普爾那口");
//                        loadedImage = dataUtilImpl.scaleBitmap(loadedImage, (float) 0.4375);
//                        finalViewHolder.goodsImage.setImageBitmap(loadedImage);
//                        finalViewHolder.goodsImage.animate().alpha(1f).setDuration(200)
//                                .setListener(new AnimatorListenerAdapter()
//                                {
//                                    @Override
//                                    public void onAnimationEnd(Animator animation)
//                                    {
//                                        finalViewHolder.goodsImage.setVisibility(View.VISIBLE);
//                                        super.onAnimationEnd(animation);
//                                    }
//                                });
//                    }
//                }
//
//                @Override
//                public void onLoadingCancelled(String imageUri, View view)
//                {}
//            });
//            finalViewHolder.goodsName.setText(mDatas.get(position).getName());
//            finalViewHolder.goodsOldprice.setText(mDatas.get(position).getOldprice());
//            finalViewHolder.goodsTrueprice.setText(mDatas.get(position).getTrueprice());
//            finalViewHolder.ll.setOnClickListener(new View.OnClickListener()
//            {
//                @Override
//                public void onClick(View v)
//                {}
//            });
        }
    }

    @Override
    public int getItemCount()
    {
        /**
         * 因為添加了頭佈局,所以數量加一
         * */
        return mDatas.size() + 1;
    }

    @Override
    public int getItemViewType(int position)
    {
        /**
         * 第一個佈局即為頭佈局
         * */
        return isHeader(position) ? ITEM_VIEW_TYPE_HEADER : ITEM_VIEW_TYPE_ITEM;
    }

    /**
     * 判斷是否是頭佈局
     * */
    public boolean isHeader(int position)
    {
        if(position == 0)
        {
            return true;
        }
        return false;
    }

    public class ViewHolder extends BaseViewHolder
    {
        public ImageView goodsImage;
        public TextView goodsName;
        public TextView goodsTrueprice;
        public TextView goodsOldprice;
        public RelativeLayout ll;

        public ViewHolder(View itemView)
        {
            super(itemView);
            goodsImage = (ImageView) itemView.findViewById(R.id.goods_ImageView);
            goodsName = (TextView) itemView.findViewById(R.id.goodsname_TextView);
            goodsTrueprice = (TextView) itemView.findViewById(R.id.goodstrueprice_TextView);
            goodsOldprice = (TextView) itemView.findViewById(R.id.goodsoldprice_TextView);
            ll = (RelativeLayout) itemView.findViewById(R.id.root_RelativeLayout);
        }
    }
}
 第一次寫,不太完整,請勿噴。有問題請加扣扣:1401429109,細細溝通。

附帶:PulltoRefreshLibiry類庫。