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

xiaoxiao2021-02-27  231

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


以上的状态示意图:我们可以将头部和身体部分以及尾部部分看成三种不同的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(); }

以上,即可

转载请注明原文地址: https://www.6miu.com/read-9641.html

最新回复(0)