一、使用单布局和设置点击事件,R.layout.item_text布局文件,new DataFactory().setSingleData()数据源,String数据类型,this上下文, holder.setText(R.id.item_text_tv, s);设置数据。
RecyclerView rv = (RecyclerView) findViewById(R.id.second_rv); rv.setLayoutManager(new LinearLayoutManager(this)); CommonAdapter adapter = null; rv.setAdapter(adapter = new CommonAdapter<String>(this, R.layout.item_text, new DataFactory().setSingleData()) { @Override protected void convert(ViewHolder holder, String s, int position) { holder.setText(R.id.item_text_tv, s); } }); adapter.setOnItemClickListener(new MultiItemTypeAdapter.OnItemClickListener() { public void onItemClick(View view, RecyclerView.ViewHolder holder, int position) { Toast.makeText(SecondActivty.this, "Click:" + position, Toast.LENGTH_SHORT).show(); } public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position) { Toast.makeText(SecondActivty.this, "Long:" + position, Toast.LENGTH_SHORT).show(); //return false;//如果返回false的话,按住响应长按事件,后响应点击事件 return true;//可以区分长按还是点击事件 } });
二、多布局的实现,很高明、多条目很清楚实现了分离和关联。
RecyclerView rv = (RecyclerView) findViewById(R.id.second_rv); rv.setLayoutManager(new LinearLayoutManager(this)); rv.setAdapter(new MultAdapter(this, new DataFactory().setMultData()));
MultAdapter.calss继承MultiItemTypeAdapter,后面的BaseCell是多条目的基类,TextCell.class、ImageCell.calss、TextImageCell正是对应绑定和加入各自对应的布局文件
public class MultAdapter extends MultiItemTypeAdapter<BaseCell> { public MultAdapter(Context context, List<BaseCell> datas) { super(context, datas); //添加三种布局 addItemViewDelegate(new TextCell()); addItemViewDelegate(new ImageCell()); addItemViewDelegate(new TextImageCell()); } }
BaseCell.class把一些共性可以抽取,其实也没什么东西。
public class BaseCell { protected String type; protected String text; protected String url; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getText() { return text; } public void setText(String text) { this.text = text; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public BaseCell() { } public BaseCell(String type, String text, String url) { this.type = type; this.text = text; this.url = url; } }
这下面几个子类实现的正是关键部分
public class TextImageCell implements ItemViewDelegate<BaseCell> { @Override public int getItemViewLayoutId() { return R.layout.item_text_image; } @Override public boolean isForViewType(BaseCell item, int position) { return "TextImageDataType".equals(item.getType()); } @Override public void convert(ViewHolder holder, BaseCell baseCell, int position) { //设置数据 holder.setText(R.id.item_text_image_tv, baseCell.getText()); holder.setImage(R.id.item_text_image_iv, baseCell.getUrl()); } }
getItemViewLayoutId返回的是对应布局文件,isForViewType这个方法这是根据当前item判断是不是这个属于布局的类型。我设置了三种布局,对应三种类型,这个类中的类型是TextImageDataType,与item中表明类型的对比,确认是不是把数据加载到这个布局上。
public class ImageCell implements ItemViewDelegate<BaseCell> { @Override public int getItemViewLayoutId() { return R.layout.item_image; } @Override public boolean isForViewType(BaseCell item, int position) { //返回true,表示使用布局 return item.getType().equals("ImageDataType"); } @Override public void convert(ViewHolder holder, BaseCell baseCell, int position) { //设置数据 holder.setImage(R.id.item_image_iv,baseCell.getUrl()); } }
public class TextCell implements ItemViewDelegate<BaseCell> { @Override public int getItemViewLayoutId() { return R.layout.item_text; } @Override public boolean isForViewType(BaseCell item, int position) { //返回true,表示使用布局 return "TextDataType".equals(item.getType()); } @Override public void convert(ViewHolder holder, BaseCell baseCell, int position) { //设置数据 holder.setText(R.id.item_text_tv,baseCell.getText()); } }
在数据源上,会明确指出属于那种类型的。下面是模拟的数据源。
public class DataFactory { //设置文本数据布局 class TextData extends BaseCell { public TextData(String type, String text) { super.type = type; super.text = text; } } //设置图片数据布局 class ImageData extends BaseCell { public ImageData(String type, String url) { super.type = type; super.url = url; } } //设置文本图片数据布局 class TextImageData extends BaseCell { public TextImageData(String type, String text, String url) { super(type, text, url); } } public List<String> setSingleData() { ArrayList<String> list = new ArrayList<>(); for (int i = 0; i < 100; i++) { list.add(String.valueOf(i)); } return list; } public List<BaseCell> setMultData() { ArrayList<BaseCell> list = new ArrayList<>(); for (int i = 0; i < 200; i++) { int dataType = new Random().nextInt(3);//0、1、2 switch (dataType) { case 0: list.add(new TextData("TextDataType", "文本数据源设置:" + i)); break; case 1: list.add(new ImageData("ImageDataType", "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3844734607,745865640&fm=26&gp=0.jpg")); break; case 2: list.add(new TextImageData("TextImageDataType", "图片数据源设置:" + i,"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1497248936253&di=2546b56bf27d9f7484ef8d3132c988d5&imgtype=0&src=http%3A%2F%2Fww1.sinaimg.cn%2Fbmiddle%2F8154ee06gw1ep7ficdmbkj20dw0ae3zm.jpg")); break; } } return list; } }
三、添加头布局、脚布局
RecyclerView rv = (RecyclerView) findViewById(R.id.second_rv); rv.setLayoutManager(new LinearLayoutManager(this)); MultAdapter mAdapter = new MultAdapter(this, new DataFactory().setMultData()); //在RecyclerView设置adpter之后 mHeaderAndFooterWrapper = new HeaderAndFooterWrapper(mAdapter); View headView = LayoutInflater.from(this).inflate(R.layout.item_header, null); ImageView iv_head = (ImageView) headView.findViewById(R.id.iv_head); Picasso.with(SecondActivty.this).load(DataFactory.url2).resize(getResources().getDisplayMetrics().widthPixels,200).into(iv_head); mHeaderAndFooterWrapper.addHeaderView(headView); mHeaderAndFooterWrapper.addFootView(headView); rv.setAdapter(mHeaderAndFooterWrapper);
使用包装之后的adapter
rv.setAdapter(mHeaderAndFooterWrapper);