给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);}

使用方法:

  1. 新建一个viewholder类继承BaseViewHolder,实现bindViewHolder方法,在里面绑定你的data数据
  2. 请看下面的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
原创粉丝点击