RecyclerView的Adapter万能适配包
2016-01-20 12:02
423 查看
转载请标明出处:/article/9450920.html
在Android L版本中,引入了appcompat新特性(RecyclerView,Toolbar,CardView,palette)
http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html(需要翻墙)
其中RecyclerView用来取代ListView和GridView
项目目录:
从这里看出,以后Recyclerview使用Adapter万能适配,减少写Adapter类(少了SimpleAdapter)
一.一个简单的RecyclerView的demo(一般写法)
1.新建Android Studio项目,在新建一个module叫simple,在simple的build.gradle加入
引入recyclerview包
2.在activity_main.xml引入recyclerview布局
3.新建item_data.xml布局,作为recyclerview的item布局
4.新建Data.java作为RecyclerView的数据Bean类
5.新建SimpleAdapter.java作为RecyclerView的Adapter
6.在MainActivity.java使用
运行效果:
二:Adapter万能适配的使用示例(减少 “一” 的第5步,也就是不用新建SimpleAdapter)
1.在app的module的build.gradle加入
引入recyclerview包
该库的地址是:https://github.com/xiejinquan/recyclerview
2,3,4和 “一” 的2,3,4步一样
5.在MainActivity.java使用
运行效果和 “一” 的运行效果一样
三.分享Adapter的万能适配类的源码
JesseAdapter.java作为RecyclerView的Adapter的万能适配
JesseHolder作为RecyclerView的Holder
源码下载
各位看官,没事就评论下,你的评论,是我写下去的动力。
在Android L版本中,引入了appcompat新特性(RecyclerView,Toolbar,CardView,palette)
http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html(需要翻墙)
其中RecyclerView用来取代ListView和GridView
项目目录:
从这里看出,以后Recyclerview使用Adapter万能适配,减少写Adapter类(少了SimpleAdapter)
一.一个简单的RecyclerView的demo(一般写法)
1.新建Android Studio项目,在新建一个module叫simple,在simple的build.gradle加入
compile 'com.jesse.recyclerview:recyclerview:23.1.1'
引入recyclerview包
2.在activity_main.xml引入recyclerview布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" tools:context="com.jesse.myapplication.MainActivity"> <!-- 引入RecyclerView布局--> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
3.新建item_data.xml布局,作为recyclerview的item布局
<?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="match_parent"> <TextView android:id="@+id/tv_name" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
4.新建Data.java作为RecyclerView的数据Bean类
public class Data { private String name; private String title; public Data(String name, String title) { this.name = name; this.title = title; } public String getName() { return name; } public String getTitle() { return title; } }
5.新建SimpleAdapter.java作为RecyclerView的Adapter
public class SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.SimpleHolder> { private Context mContext; private int mResID; private List<Data> mDatas; public SimpleAdapter(Context mContext, int mResID, List<Data> mDatas) { this.mContext = mContext; this.mResID = mResID; this.mDatas = mDatas; } @Override public SimpleHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view= LayoutInflater.from(mContext).inflate(mResID,parent,false); return new SimpleHolder(view);//加载item的布局 } @Override public void onBindViewHolder(final SimpleHolder holder, int position) { //item的单击事件 holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClickListener != null) { int layoutPosition = holder.getLayoutPosition(); mOnItemClickListener.onItemClick(holder.itemView, layoutPosition); } } }); //设置item的子view设置数据 holder.tv_name.setText(mDatas.get(position).getName()); holder.tv_title.setText(mDatas.get(position).getTitle()); } @Override public int getItemCount() { return mDatas==null?0:mDatas.size(); } public class SimpleHolder extends RecyclerView.ViewHolder { private TextView tv_name; private TextView tv_title; public SimpleHolder(View itemView) { super(itemView); //初始化id tv_name= (TextView) itemView.findViewById(R.id.tv_name); tv_title= (TextView) itemView.findViewById(R.id.tv_title); } } public void addData(int pos, Data t) { mDatas.add(pos, t); // notifyDataSetChanged(); notifyItemInserted(pos); } public void addData(Data t) { mDatas.add(t); notifyDataSetChanged(); } public void removeData(int pos) { mDatas.remove(pos); // notifyDataSetChanged(); notifyItemRemoved(pos); } public interface OnItemClickListener { void onItemClick(View view, int position); } private OnItemClickListener mOnItemClickListener; public void setOnItemClickListener(OnItemClickListener mOnItemClickListener) { this.mOnItemClickListener = mOnItemClickListener; } }
6.在MainActivity.java使用
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initDatas(); assignViews(); initRecyclerview(); } private SimpleAdapter mAdapter; private void initRecyclerview() { //设置mRecyclerview的item向下排列 mRecyclerview.setLayoutManager(new LinearLayoutManager(this)); mAdapter=new SimpleAdapter(this,R.layout.item_data,mDatas); mRecyclerview.setAdapter(mAdapter); //设置mRecyclerview的item单击事件 mAdapter.setOnItemClickListener(new SimpleAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Toast.makeText(MainActivity.this,"toast"+position,Toast.LENGTH_SHORT).show(); } }); } private List<Data> mDatas; //初始化数据 private void initDatas() { mDatas=new ArrayList<>(); for (int i=0;i<10;i++){ mDatas.add(new Data("jesse"+i,"title"+i)); } } private RecyclerView mRecyclerview; //初始化布局id private void assignViews() { mRecyclerview = (RecyclerView) findViewById(R.id.recyclerview); } }
运行效果:
二:Adapter万能适配的使用示例(减少 “一” 的第5步,也就是不用新建SimpleAdapter)
1.在app的module的build.gradle加入
compile 'com.jesse.recyclerview:recyclerview:23.1.1'
引入recyclerview包
该库的地址是:https://github.com/xiejinquan/recyclerview
2,3,4和 “一” 的2,3,4步一样
5.在MainActivity.java使用
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initDatas(); assignViews(); initRecyclerview(); } private JesseAdapter<Data> mAdapter; /** * 设置Recyclerview */ private void initRecyclerview() { mRecyclerview.setLayoutManager(new LinearLayoutManager(this)); mAdapter=new JesseAdapter<Data>(this,R.layout.item_data,mDatas) { @Override public void onBindView(JesseHolder holder, int position) { TextView tv_name=holder.getView(R.id.tv_name); tv_name.setText(mDatas.get(position).getName()); TextView tv_title=holder.getView(R.id.tv_title); tv_title.setText(mDatas.get(position).getTitle()); } }; mRecyclerview.setAdapter(mAdapter); } private List<Data> mDatas; /** * 初始化数据 */ private void initDatas() { mDatas=new ArrayList<>(); for (int i=0;i<10;i++){ mDatas.add(new Data("jesse"+i,"title"+i)); } } private RecyclerView mRecyclerview; /** * 初始化布局的id */ private void assignViews() { mRecyclerview = (RecyclerView) findViewById(R.id.recyclerview); } }
运行效果和 “一” 的运行效果一样
三.分享Adapter的万能适配类的源码
JesseAdapter.java作为RecyclerView的Adapter的万能适配
public abstract class JesseAdapter<T> extends RecyclerView.Adapter<JesseHolder> { protected Context mContext; protected int mLayout; protected List<T> mDatas; public JesseAdapter(Context mContext, int mLayout, List<T> mDatas) { this.mContext = mContext; this.mLayout = mLayout; this.mDatas = mDatas; } @Override public JesseHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(mLayout, parent, false); return new JesseHolder(view); } @Override public void onBindViewHolder(final JesseHolder holder, int position) { holder.getItemView().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClickListener != null) { int layoutPosition = holder.getLayoutPosition(); mOnItemClickListener.onItemClick(holder.getItemView(), layoutPosition); } } }); onBindView(holder, position); } public abstract void onBindView(JesseHolder holder, int position); @Override public int getItemCount() { return mDatas == null ? 0 : mDatas.size(); } public void addData(int pos, T t) { mDatas.add(pos, t); // notifyDataSetChanged(); notifyItemInserted(pos); } public void addData(T t) { mDatas.add(t); notifyDataSetChanged(); } public void removeData(int pos) { mDatas.remove(pos); // notifyDataSetChanged(); notifyItemRemoved(pos); } public interface OnItemClickListener { void onItemClick(View view, int position); } private OnItemClickListener mOnItemClickListener; public void setOnItemClickListener(OnItemClickListener mOnItemClickListener) { this.mOnItemClickListener = mOnItemClickListener; } }
JesseHolder作为RecyclerView的Holder
public class JesseHolder extends RecyclerView.ViewHolder { private final SparseArray<View> mViews; private View mItemView; public JesseHolder(View mItemView) { super(mItemView); this.mItemView = mItemView; this.mViews = new SparseArray<View>(); } public View getItemView() { return mItemView; } public <T extends View> T getView(int viewId) { View view = mViews.get(viewId); if (view == null) { view = mItemView.findViewById(viewId); mViews.put(viewId, view); } return (T) view; } }
源码下载
各位看官,没事就评论下,你的评论,是我写下去的动力。
相关文章推荐
- Core Animation之多种动画效果
- Android 序列化--Parcelable
- 十折交叉验证
- 伪类和伪元素
- C#调用C++dll文件 运行提示找不到函数的入口点
- 献给初学iOS的小盆友们——微博app项目开发之四设置导航功能
- poj1004 Financial Management
- JS实现移动端图片延迟加载
- EM算法
- CALayer的position和anchorPoint
- Android中Intent传递对象的两种方法Serializable,Parcelable
- c# VS2008中如何修改winfrom控件的可访问性
- mysql settings
- 360广告联盟对比百度广告联盟
- 打开应用时出现“你的手机上未安装应用程序”--实际上该应用已经安装的解决方案
- VS2010 无法命中断点
- python--pack
- python--socket
- 修改MYSQL的端口方法
- 引用自鸟哥的私房菜 几条比较好的学习方针