这个是把RecycleView的适配器给封装了,直接调用就可以了,还添加了可以添加head头部功能,很赞的,今天记下来,下次直接用
package com.wwl.android; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public static final int TYPE_HEADER = 0; public static final int TYPE_NORMAL = 1; private ArrayList<T> mDatas = new ArrayList<>(); private View mHeaderView; private OnItemClickListener mListener; public void setOnItemClickListener(OnItemClickListener li) { mListener = li; } public void setHeaderView(View headerView) { mHeaderView = headerView; notifyItemInserted(0); } public View getHeaderView() { return mHeaderView; } public void addDatas(ArrayList<T> datas) { mDatas.addAll(datas); notifyDataSetChanged(); } @Override public int getItemViewType(int position) { if(mHeaderView == null) return TYPE_NORMAL; if(position == 0) return TYPE_HEADER; return TYPE_NORMAL; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, final int viewType) { if(mHeaderView != null && viewType == TYPE_HEADER) return new Holder(mHeaderView); return onCreate(parent, viewType); } @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { if(getItemViewType(position) == TYPE_HEADER) return; final int pos = getRealPosition(viewHolder); final T data = mDatas.get(pos); onBind(viewHolder, pos, data); if(mListener != null) { viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onItemClick(pos, data); } }); } } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); RecyclerView.LayoutManager manager = recyclerView.getLayoutManager(); if(manager instanceof GridLayoutManager) { final GridLayoutManager gridManager = ((GridLayoutManager) manager); gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { return getItemViewType(position) == TYPE_HEADER ? gridManager.getSpanCount() : 1; } }); } } @Override public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { super.onViewAttachedToWindow(holder); ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); if(lp != null && lp instanceof StaggeredGridLayoutManager.LayoutParams && holder.getLayoutPosition() == 0) { StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp; p.setFullSpan(true); } } public int getRealPosition(RecyclerView.ViewHolder holder) { int position = holder.getLayoutPosition(); return mHeaderView == null ? position : position - 1; } @Override public int getItemCount() { return mHeaderView == null ? mDatas.size() : mDatas.size() + 1; } public abstract RecyclerView.ViewHolder onCreate(ViewGroup parent, final int viewType); public abstract void onBind(RecyclerView.ViewHolder viewHolder, int RealPosition, T data); public class Holder extends RecyclerView.ViewHolder { public Holder(View itemView) { super(itemView); } } public interface OnItemClickListener<T> { void onItemClick(int position, T data); } }
然后在外面自己的适配器中直接继承就可以了
package com.wwl.android; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /** * wwl */ public class MyAdapter extends BaseRecyclerAdapter<String> { @Override public RecyclerView.ViewHolder onCreate(ViewGroup parent, int viewType) { View layout = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); return new MyHolder(layout); } @Override public void onBind(RecyclerView.ViewHolder viewHolder, int RealPosition, String data) { if(viewHolder instanceof MyHolder) { ((MyHolder) viewHolder).text.setText(data); } } class MyHolder extends BaseRecyclerAdapter.Holder { TextView text; public MyHolder(View itemView) { super(itemView); text = (TextView) itemView.findViewById(R.id.text); } } }
然后在类中调用,
public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private RecyclerView.LayoutManager mLayoutManager; private MyAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRecyclerView = (RecyclerView) findViewById(R.id.list); // mLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); mLayoutManager = new GridLayoutManager(this, 2); // mLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); mRecyclerView.addItemDecoration(new GridItemDecoration(this, true)); mAdapter = new MyAdapter(); mRecyclerView.setAdapter(mAdapter); mAdapter.addDatas(generateData()); setHeader(mRecyclerView); mAdapter.setOnItemClickListener(new BaseRecyclerAdapter.OnItemClickListener<String>() { @Override public void onItemClick(int position, String data) { Toast.makeText(MainActivity.this, position + "," + data, Toast.LENGTH_SHORT).show(); } }); } private void setHeader(RecyclerView view) { View header = LayoutInflater.from(this).inflate(R.layout.header, view, false); mAdapter.setHeaderView(header); } private ArrayList<String> generateData() { ArrayList<String> data = new ArrayList<String>() { { for(int i=0;i<21;i++) add("数据" + i); } }; return data; } }
这样就OK啦。
布局文件:
R.layout.activity_main
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
header.xml
<?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="wrap_content" android:orientation="vertical"> <ImageView android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher"/> </LinearLayout>
item.xml
<?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="wrap_content" android:padding="20dp" android:orientation="vertical"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="数据"/> </RelativeLayout>
至此,结束,感谢那位大神,非常好用
相关推荐
本文将详细介绍如何在`RecyclerView`中添加Header并进行封装,以便于在多个地方复用。 首先,我们需要创建一个抽象的`BaseRecyclerAdapter`,它是`RecyclerView.Adapter`的子类。这个适配器将会负责处理数据和视图...
添加头部和尾部,点击展开或者隐藏item部分类容 添加头部和尾部,点击展开或者隐藏item部分类容 添加头部和尾部,点击展开或者隐藏item部分类容 添加头部和尾部,点击展开或者隐藏item部分类容 添加头部和尾部,点击...
在实际应用中,我们常常需要在列表的顶部添加一个Header(头部视图),比如广告条或者分类标签。本教程将详细介绍如何在RecyclerView的Adapter基础上添加Header View。 首先,了解RecyclerView的基本结构。...
本篇将深入探讨如何在封装ListView和RecyclerView的Adapter时,兼顾重用性和可读性,同时避免过度抽象。 首先,理解Adapter的基本工作原理。Adapter是数据模型和视图之间的桥梁,它持有数据集,并通过getView()方法...
`RecycleView`的简单封装是开发者常用的技术手段,以实现更便捷的使用和自定义功能。在这个主题中,我们将探讨`RecycleView`的基本使用、点击事件、长按事件、状态变化处理以及如何添加`EmptyView`。 首先,`...
高度自定义的沉浸式,商城sku算法,仿了吗购物车(带缓存),装饰类的RecycleView添加头尾。.zip,高度自定义的沉浸式,商城sku算法,仿了吗购物车(带缓存),装饰类的RecycleView添加头尾
本主题将深入探讨如何在RecyclerView中实现item的动态添加、删除功能,并且在item内部嵌套EditText以实现数据输入。以下是详细的步骤和知识点。 ### RecyclerView基本使用 1. **添加依赖**:首先,在项目的build....
2. **全选与反选功能**:可以设置一个全局变量表示全选状态,然后在主RecycleView的每个子项上添加一个CheckBox。当全选按钮被点击时,改变全局变量并遍历所有子项,更新CheckBox的状态。同样,当单个商品被选中或...
本教程将详细介绍如何在RecyclerView中集成Google官方的SwipeRefreshLayout,实现上拉刷新和下拉加载更多功能,并添加自定义的header和footer布局,以增强用户体验。 首先,我们需要引入Google的`design`库,它包含...
1. **RecyclerView.Adapter**:适配器是连接数据源与RecycleView的桥梁,负责将数据转化为视图,并将这些视图添加到RecycleView中。你需要继承RecyclerView.Adapter,并实现其中的方法,如onCreateViewHolder、...
`RecycleView`是Android开发中的一个重要组件,它在应用设计中扮演着核心角色,尤其在数据展示方面。本篇文章将深入探讨`RecycleView`的原理、使用方法以及如何实现一个简单的联系人列表功能。 ### 1. `RecycleView...
1. **创建自定义RecyclerView**: 为了适应不同的需求,通常我们会创建一个继承自`RecyclerView` 的自定义类,添加额外的功能或设置默认配置。例如,可以在这个类中设置默认的布局管理器、适配器和滑动监听器。 2. *...
本教程将深入讲解RecyclerView的基本使用、封装、多条目布局以及如何添加头部和底部。 ### 基本使用 首先,你需要在XML布局文件中添加RecyclerView控件,并设置其ID。在Activity或Fragment的Java代码中,通过...
案例中的`MyRecycleView`可能是项目的主布局文件或者自定义的RecycleView组件,包含了RecycleView的初始化和配置代码。通过查看和分析这个文件,你可以了解到RecycleView是如何与数据源、Adapter和布局管理器配合...
本项目针对RecyclerView进行了一次二次封装,以实现更灵活的功能,包括添加头布局、尾部布局以及空布局。下面将详细介绍这个封装的Adapter以及其支持的特性。 1. **头布局与尾部布局**: - 头布局(Header Layout...
在Android开发中,RecycleView是一个非常重要的组件,它用于展示可滚动的列表数据,具有高效的数据复用机制,能够显著提升应用性能并减少内存消耗。本Demo将深入讲解如何手写一个RecycleView,包括其核心原理和关键...
开发者可能已经展示了如何创建和配置RecycleView,包括适配器的编写、数据绑定、布局管理器的选择以及可能的自定义动画。通过分析这个项目,你可以更好地理解和掌握RecycleView在实际开发中的运用。 总之,Android ...
"列表封装RecycleView"的主题通常涉及如何创建自定义适配器、布局管理器以及优化RecycleView的使用。 一、RecycleView的基本原理 RecycleView的核心思想是视图复用,当一个列表项滑出屏幕时,它的视图将被回收并...
### RecycleView嵌套RecycleView滑动焦点问题解析及解决方案 #### 一、问题背景与分析 在Android开发过程中,经常会遇到需要在一个`RecyclerView`内部嵌套另一个`RecyclerView`的情况,例如展示商品分类时,每一类...