给Recyclerview的item设置不同布局的Adapter
来源:互联网 发布:网络接入服务 编辑:程序博客网 时间:2024/05/01 19:49
给Recyclerview的item设置不同布局的Adapter
recyclerview是android5.0后出的一种全新的控件,可以用来代替原始的listview,gridview等,recyclerview具体的使用方法请移步—— [ Hongyang ]
第一次写博客,也不知道在写什么了,请多多包涵,不废话了,直接上代码了哦
package com.mosl.commonrecyclerview.adapter;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import java.util.ArrayList;import java.util.List;import java.util.Map;/** * @Description 通用的adapter 可设置不同的item布局 * @Author MoseLin * @Date 2016/7/21. */public class CommonRecycleViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ private List datas = new ArrayList<>(); private Context context; private AdapterTemplate template; public CommonRecycleViewAdapter(Context context, List datas, AdapterTemplate template){ this.context = context; this.datas = datas; this.template = template; } @Override public int getItemViewType(int position) { //根据实体类的class确定item的布局 return template.getItemViewType().get(datas.get(position).getClass()); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //通过反射来建立viewholder try { return template.getViewHolder().get(viewType).getConstructor(View.class).newInstance(LayoutInflater.from(context).inflate(viewType,parent,false)); } catch ( Exception e ) { e.printStackTrace(); } return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { // 给viewholder绑定数据 BaseViewHolder viewHolder = ( BaseViewHolder ) holder; viewHolder.bindViewHolder(datas.get(position)); } @Override public int getItemCount() { return datas.size(); } public interface AdapterTemplate { /** * * @return map, class is entity class , integer is layoutId */ Map<Class<?>,Integer> getItemViewType(); /** * * @return map, integer is layoutId,class is what extents BaseViewHolder */ Map<Integer,Class<? extends BaseViewHolder>> getViewHolder(); }}
首先我们定义一个adapter来继承RecyclerView.Adapter,重写实现其中的四个主要方法getItemViewType,onCreateViewHolder,onBindViewHolder,getItemCount;那么我们要实现不同的item布局,那么最主要的就是实现getItemViewType这个方法。
我们可能还需要让这个adapter能成为一个共用的组件,那么就来定义一个内部的接口类:AdapterTemplate,我们可以在我们需要的地方去实现这个接口,那么就可以达到复用的目的了。上面也有注释了就不再啰嗦了,呵呵!
再次我们要自定义一个抽象的BaseViewHolder类继承自RecyclerView.ViewHolder,这个类的目的是为了能更好的扩展不同的item布局,且其中用到了注解来注册控件,以后再也不用那些啰嗦的findViewById了,注解的详细使用请移步 [ butterknife]
BaseViewHolder代码如下
package com.mosl.commonrecyclerview.adapter;import android.support.v7.widget.RecyclerView;import android.view.View;import butterknife.ButterKnife;/** * @Description * @Author MoseLin * @Date 2016/7/21. */public abstract class BaseViewHolder<T> extends RecyclerView.ViewHolder{ BaseViewHolder(View itemView) { super(itemView); ButterKnife.bind(this,itemView);//bind 注解 } public abstract void bindViewHolder(T data);}
使用方法:
- 新建一个viewholder类继承BaseViewHolder,实现bindViewHolder方法,在里面绑定你的data数据
- 请看下面的MainActivity类,0.0,尴尬尴尬,没词写了
package com.mosl.commonrecyclerview;import android.annotation.SuppressLint;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import com.mosl.commonrecyclerview.adapter.BaseViewHolder;import com.mosl.commonrecyclerview.adapter.CommonRecycleViewAdapter;import com.mosl.commonrecyclerview.adapter.DividerItemDecoration;import com.mosl.commonrecyclerview.adapter.TestViewHolder;import com.mosl.commonrecyclerview.adapter.WechatViewHolder;import com.mosl.commonrecyclerview.model.TestEntity;import com.mosl.commonrecyclerview.model.WechatEntity;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import butterknife.Bind;import butterknife.ButterKnife;public class MainActivity extends AppCompatActivity implements CommonRecycleViewAdapter.AdapterTemplate{ @Bind(R.id.ryView) RecyclerView ryView; private CommonRecycleViewAdapter adapter; private List<Object> datas = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); adapter = new CommonRecycleViewAdapter(this,datas,this); ryView.setLayoutManager(new LinearLayoutManager(this)); ryView.addItemDecoration(DividerItemDecoration.createHorizontalDivider(this,12)); ryView.setAdapter(adapter); refreshUi(); } public void refreshUi() { TestEntity testEntity = new TestEntity(); testEntity.title = "测试头部"; testEntity.content = "测试头部&测试头部*测试头部"; datas.add(testEntity); for (int i = 0 ;i<10;i++){ WechatEntity entity = new WechatEntity(); entity.title = "item"+i; datas.add(entity); } adapter.notifyDataSetChanged(); } //根据你的数据确定item布局 @Override public Map<Class<?>, Integer> getItemViewType() { Map<Class<?>, Integer> map = new HashMap<>(); map.put(WechatEntity.class,R.layout.main_item); map.put(TestEntity.class,R.layout.test_item); return map; } //根据item布局确定viewholder @Override public Map<Integer, Class<? extends BaseViewHolder>> getViewHolder() { @SuppressLint("UseSparseArrays") Map<Integer, Class<? extends BaseViewHolder>> map = new HashMap<>(); map.put(R.layout.main_item, WechatViewHolder.class); map.put(R.layout.test_item, TestViewHolder.class); return map; }}
ok,主要的代码都在这里了,具体的源码请点下面的连接
[ CommonRecyclerViewAdapter]
本人新手菜鸟,如有不良之处请指教,切勿乱喷,谢谢!
0 0
- 给Recyclerview的item设置不同布局的Adapter
- 自定义Adapter 加载不同布局的item
- CoordinatorLayout +RecyclerView+加载不同布局的item
- RecyclerView之添加不同的item布局
- CoordinatorLayout +RecyclerView+加载不同布局的item
- Recyclerview 多种 item 布局的通用 Adapter MultiItemAdapter
- Andriod之Adapter的getViewTypeCount和getItemViewType为Listview的item设置不同的布局
- 记录:在使用 Adapter是对 item的点击设置,合并,不同布局实现
- GridView设置不同的item(布局)
- RecyclerView添加多个样式不同的Item布局
- RecyclerView添加多个样式不同的Item布局
- 为RecyclerView的不同item项实现不同的布局(添加分类Header)
- 为RecyclerView的不同item项实现不同的布局(添加分类Header)
- Android为ListView的Item设置不同的布局
- Android为ListView的Item设置不同的布局
- Android为ListView的Item设置不同的布局
- Android为ListView的Item设置不同的布局
- getItemViewType为Listview的item设置不同的布局
- synchronized关键字详解
- Java去掉小数点后面不需要的0
- x&(x-1)
- Swift - 如何用Reachability来混编判断网络状况
- 5-23 IP地址转换 (20分) (位操作)
- 给Recyclerview的item设置不同布局的Adapter
- 寻访x86处理器“实模式”和“保护模式”的前世今生
- spring配置文件详解(applicationContext.xml)
- 2013长沙现场赛J - Josephina and RPG
- hdu2846 Repository (字典树)
- Mac OS X 系统目录结构
- 安卓开发网络资源汇总
- 实现一个类只能被实例化一次
- css 3中的box-sizing属性