RecyclerView的Item多种类型的选择之普通方法实现及item内多个点击事件

首先上效果图:二种不同的管理器

这里写图片描述


这里写图片描述

以上的状态示意图:我们可以将头部和身体部分以及尾部部分看成三种不同的Type类型

代码如下:注释很清晰
第一步:窗口代码

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RecyclerView   mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);

        //设置listView管理器
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        //设置垂直方向
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(linearLayoutManager);


        //Grid表格布局
        /*GridLayoutManager gridLayoutManager = new GridLayoutManager(this,2);
        mRecyclerView.setLayoutManager(gridLayoutManager);*/
        // 同时在adapter中必须去实现onAttachedToRecyclerView

        //设置其Adapter
        ProductAdapter productAdapter = new ProductAdapter(this);
        mRecyclerView.setAdapter(productAdapter);
    }

第二步:适配器中代码如下:

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

    private Context mContext;

    public ProductAdapter(Context context) {
        this.mContext = context;
    }

    //设置三种不同Item类型,分别是头部,item,尾部
    public static final int ITME_TYPE_HEADER = 1;
    public static final int ITME_TYPE_CONTENT = 2;
    public static final int ITME_TYPE_BOTTOM = 3;

    //模拟填充假数据
    public String[] texts = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "P"};

    //设置默认头部和底部数据只有一个
    private int mHeadCount = 1;
    private int mButtomCount = 1;

    //获得内容的长度
    public int getContentItemCount() {
        return texts.length;
    }

    //根据不同类型的viewType,创建不同的ViewHolder
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case ITME_TYPE_HEADER:
                View view = LayoutInflater.from(mContext).inflate(R.layout.head_recycler_adapter, parent, false);
                return new HeadViewHolder(view);
            case ITME_TYPE_CONTENT:
                View view2 = LayoutInflater.from(mContext).inflate(R.layout.content_recycler_adapter, parent, false);
                return new ContentViewHolder(view2);
            case ITME_TYPE_BOTTOM:
                View view1 = LayoutInflater.from(mContext).inflate(R.layout.buttom_recycler_adapter, parent, false);
                return new ButtomViewHolder(view1);
        }
        return null;
    }

    //头部ViewHolder
    public static class HeadViewHolder extends RecyclerView.ViewHolder {

        HeadViewHolder(View itemView) {
            super(itemView);
        }
    }

    //尾部ViewHodler
    public static class ButtomViewHolder extends RecyclerView.ViewHolder {

        ButtomViewHolder(View itemView) {
            super(itemView);
        }
    }

    //内容ViewHodler
    public static class ContentViewHolder extends RecyclerView.ViewHolder {
        private TextView tv_item_text;

        ContentViewHolder(View itemView) {
            super(itemView);
            tv_item_text = (TextView) itemView.findViewById(R.id.tv_item_text);
        }
    }

    //绑定数据
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        //hodler来区别绑定不同的数据
        if (holder instanceof HeadViewHolder) {
            //具体的控件填充参数处理机其他如点击事件

        } else if (holder instanceof ContentViewHolder) {
            //索引position必须要减去其头部的个数
            ((ContentViewHolder) holder).tv_item_text.setText(texts[position - mHeadCount]);

        } else if (holder instanceof ButtomViewHolder) {
            //具体的控件填充参数处理机其他如点击事件

        }
    }

    //返回总的视图个数
    @Override
    public int getItemCount() {
        return mHeadCount + mButtomCount +getContentItemCount();
    }

    //分别返回三种不同类型的TYPE
    @Override
    public int getItemViewType(int position) {
        int dataItemCount = getContentItemCount();
        if (mHeadCount != 0 && position < mHeadCount) {
            return ITME_TYPE_HEADER;

        } else if (mButtomCount != 0 && position >= (dataItemCount + mHeadCount)) {

            return ITME_TYPE_BOTTOM;
        } else {
            return ITME_TYPE_CONTENT;
        }
    }

//当如果是Grid布局的时候需要去实现
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
        if(layoutManager instanceof GridLayoutManager) {
            final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
            gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    return  getItemViewType(position) == ITME_TYPE_HEADER || getItemViewType(position) == ITME_TYPE_BOTTOM ? gridLayoutManager.getSpanCount():1;
                }
            });
        }
    }
}

第三步:简单的贴出使用CardView的代码–即content_recycler_adapter

compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.android.support:cardview-v7:25.3.1'

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/cv_item"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="2dp"
    android:foreground="?android:attr/selectableItemBackground"
    card_view:cardBackgroundColor="#d7070b"
    card_view:cardCornerRadius="4dp"
    card_view:cardElevation="4dp">

    <TextView
        android:layout_gravity="center_horizontal"
        android:id="@+id/tv_item_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="2dp"
        android:text="test"/>
</android.support.v7.widget.CardView>

以上:即可实现

下面实现recyclerView内item中存在多个子控件的点击事件
第一步:在adapte内定义接口,及多个点击方法和对外暴露的方法

 private recycViewItemClick mItemInnerClickListener;
//对外暴露方法
    public void setOnItemDeleteClickListener(recycViewItemClick mItemInnerClickListener) {
        this.mItemInnerClickListener = mItemInnerClickListener;
    }
    //定义接口及内的方法
    public interface recycViewItemClick{
        public void ClickImageButtonDel(URLBean urlBean);

        public void ClickTextGetURl(String URL);
    }

第二步:分别实现子控件的点击方法

 @Override
    public void onBindViewHolder(AddreddHodler holder, int position) {
        final URLBean urlBean = urlBeans.get(position);
        final String url = urlBean.url;
        if(!TextUtils.isEmpty(url)) {
            holder.mSavaAddressUrl.setText(url);
        }
        holder.mDeleteAddressUrl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                urlBeans.remove(urlBean);
                mItemInnerClickListener.ClickImageButtonDel(urlBean);
            }
        });
        holder.mSavaAddressUrl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mItemInnerClickListener.ClickTextGetURl(url);
            }
        });
    }

第三步:在外调用暴露在外的接口方法

mAddressAdapter.setOnItemDeleteClickListener(this);
 @Override
    public void ClickImageButtonDel(URLBean urlBean) {
        URLDao.deleteURL(urlBean);
        mAddressAdapter.notifyDataSetChanged();
    }

    @Override
    public void ClickTextGetURl(String URL) {
        mInputUrl.setText(URL);
        mPopupWindow.dismiss();
    }

以上,即可

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值