用RecyclerView+CardView实现 商城首页

来源:互联网 发布:淘宝介入对卖家不公平 编辑:程序博客网 时间:2024/04/30 21:06

商城首页用来展示热门活动的View,偶数和奇数 位上的View不同。

1)CardView,扩展 FrameLayout 类别并让您能够显示卡片内的信息,这些信息在整个平台中拥有一致的呈现方式。CardView 小组件可拥有阴影和圆角。

2)实现步骤

①添加依赖

compile 'com.android.support:cardview-v7:21.0.+'
compile 'com.android.support:recyclerview-v7:21.0.+'

②加入RecyclerView布局,得到RecyclerView实例,通过网络操作得到数据源,都与前面相同

③实现Adapter

public class HomeCatgoryAdapter extends RecyclerView.Adapter<HomeCatgoryAdapter.ViewHolder> {

    private List<HomeCampaign> mDatas;
    private  Context mContext;
    public HomeCatgoryAdapter(List<HomeCampaign> datasContext context){
        mDatas = datas;
        this.mContext = context;
    }

    private  OnCampaignClickListener mListener;
    public void setOnCampaignClickListener(OnCampaignClickListener listener){
        this.mListener = listener;
    }
    public  interface OnCampaignClickListener{
        void onClick(View viewCampaign campaign);
    }

    private  static int VIEW_TYPE_L=0;
    private  static int VIEW_TYPE_R=1;
    private LayoutInflater mInflater;
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) {
        mInflater = LayoutInflater.from(viewGroup.getContext());
        if(type == VIEW_TYPE_R){
            return  new ViewHolder(mInflater.inflate(R.layout.template_home_cardview2,viewGroup,false));
        }
        return  new ViewHolder(mInflater.inflate(R.layout.template_home_cardview,viewGroup,false));
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int i) {
        HomeCampaign homeCampaign = mDatas.get(i);
        viewHolder.textTitle.setText(homeCampaign.getTitle());
        Picasso.with(mContext).load(homeCampaign.getCpOne().getImgUrl()).into(viewHolder.imageViewBig);
     Picasso.with(mContext).load(homeCampaign.getCpTwo().getImgUrl()).into(viewHolder.imageViewSmallTop);
        Picasso.with(mContext).load(homeCampaign.getCpThree().getImgUrl()).into(viewHolder.imageViewSmallBottom);

    }

    @Override
    public int getItemCount() {
        return mDatas.size();
    }
    @Override
    public int getItemViewType(int position) {
        if(position % 2==0){
            return  VIEW_TYPE_R;
        }
        else return VIEW_TYPE_L;
    }


      class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        TextView textTitle;
        ImageView imageViewBig;
        ImageView imageViewSmallTop;
        ImageView imageViewSmallBottom;

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


            textTitle = (TextView) itemView.findViewById(R.id.text_title);
            imageViewBig = (ImageView) itemView.findViewById(R.id.imgview_big);
            imageViewSmallTop = (ImageView) itemView.findViewById(R.id.imgview_small_top);
            imageViewSmallBottom = (ImageView) itemView.findViewById(R.id.imgview_small_bottom);

            imageViewBig.setOnClickListener(this);
            imageViewSmallTop.setOnClickListener(this);
            imageViewSmallBottom.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if(mListener !=null){
                anim(v);
            }
        }

          private  void anim(final View v){
              ObjectAnimator animator =  ObjectAnimator.ofFloat(v"rotationX"0.0F360.0F)
                      .setDuration(200);
              animator.addListener(new AnimatorListenerAdapter() {
                  @Override
                  public void onAnimationEnd(Animator animation) {
                      HomeCampaign campaign = mDatas.get(getLayoutPosition());

                      switch (v.getId()){

                          case  R.id.imgview_big:
                              mListener.onClick(vcampaign.getCpOne());
                              break;

                          case  R.id.imgview_small_top:
                              mListener.onClick(vcampaign.getCpTwo());
                              break;

                          case R.id.imgview_small_bottom:
                              mListener.onClick(v,campaign.getCpThree());
                              break;
                      }

                  }
              });
              animator.start();
          }
    }
}

④实例化Adapter,设置监听器,将RecyclerViewdapter绑定

mAdatper new HomeCatgoryAdapter(homeCampaigns,getActivity());
mAdatper.setOnCampaignClickListener(new HomeCatgoryAdapter.OnCampaignClickListener() {
    @Override
    public void onClick(View viewCampaign campaign) {
        Toast.makeText(getContext()"clicked"Toast.LENGTH_LONG).show();
        Intent intent = new Intent(getActivity()WareListActivity.class);
        intent.putExtra(Contants.COMPAINGAIN_ID,campaign.getId());
        startActivity(intent);
    }
});

mRecyclerView.setAdapter(mAdatper);

 

⑤自定义ItemDocoration

public class CardViewtemDecortion extends RecyclerView.ItemDecoration {

    @Override
    public void onDraw(Canvas cRecyclerView parentRecyclerView.State state) {
        super.onDraw(cparentstate);
    }

    @Override
    public void onDrawOver(Canvas cRecyclerView parentRecyclerView.State state) {
        super.onDrawOver(cparentstate);
    }

    @Override
    public void getItemOffsets(Rect outRectView viewRecyclerView parentRecyclerView.State state) {

        int layoutOrientation = getOrientation(parent);
        if (layoutOrientation == LinearLayoutManager.VERTICAL) {
            outRect.top 10;
            outRect.left=5;
            outRect.right=5;
        else if(layoutOrientation == LinearLayoutManager.HORIZONTAL) {
            outRect.left 5;
        }
    }

    private int getOrientation(RecyclerView parent) {
        if (parent.getLayoutManager() instanceof LinearLayoutManager) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
            return layoutManager.getOrientation();
        else throw new IllegalStateException("DividerItemDecoration can only be used with a LinearLayoutManager.");
    }
}

 

⑥将自定义ItemDocoration传入RecyclerView

mRecyclerView.addItemDecoration(new CardViewtemDecortion());

 

⑦为RecyclerView传入布局管理器

mRecyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity()));

RecyclerView中每个Item的布局为:

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_gravity="center"
    android:gravity="center"

    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="#fff"
    app:contentPadding="10dp"
    app:cardCornerRadius="4dp">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        ......

    </LinearLayout>

</android.support.v7.widget.CardView>

0 0
原创粉丝点击