如何优雅地实现Adapter多布局列表 – 触屏版

什么优雅地变卖改写者适应者多排列表

声称工夫:2018-01-18起源:广播网 向上负载者:用户

布局优雅Adapter变卖什么列表

绍介

现时在实践功绩中。,越来越多的人选择RealVIEW来变卖列表布局。,RecyclerView写的更多。,每回都要直的承受Adapter变卖onCreateViewHolder、onBindViewHolder、总计这三种办法。,不管怎样信号量变动从而产生断层很大。,不管怎样全部XXXAdter差不多都是俱的。,反复信号,功绩者是末版无论什么人笔墨的人。,于是,有多的开源库将Inter封装在改写者适应者上。。于是,本文还绍介了无论什么人本身封装的改写者适应者。,扶助您紧的事实上添加无论什么人列表(包罗单项的列表)。

试映

让人们来看一眼末版的终结。

什么优雅地变卖改写者适应者多排列表

多签订协议清单

改写者适应者的信号异乎寻常的少。,体验它。

public class MyMultiAdapter extends BaseMultiAdapter {

@Override

public void bind(BaseViewHolder holder, int layoutRes) {

}

}

嗯,没错,您只必要变卖绑定办法。,绑定办法用于设置有些人看待的应用后随即抛掉的东西设置。,诸如,翻开呼应点击事变。,长强迫征兵事变等。。因而我不注意写无论什么东西。。

总体思绪

手脚能够到的范围遍及瞄准

Adapter

用模板印出的文字或图案,防止笔墨

Adapter

有雅量的反复信号,茫然的几个的交流。

经过启用通知类变卖 IMultiItem交流,放有几分

Adapter

信号被播送到使具有特性的通知类。,而缺席

Adapter

决定通知典型和ViewType。这使得从容的添加新的签订协议(ViewType)典型。,缩减耦合,

Adapter

感触不到。 特别典型的签订协议。

高内聚,低耦合,方便的传播。

封装 ViewHolder,将对View的经用巧妙地控制都附带说明升。

变卖

人们先看一下BaseViewHolder:BaseViewHolder封装了人们有些人经用的巧妙地控制,诸如,获取子看待,设置签订协议点击事变,设置项瞄准子看待呼应点击事变等。。获取我应用男朋友[]阻止缓存的子看待。,不注意应用SpasRayx来缓存看待。,我先前次要视野AGELA的源信号。,这执意为什么人们这样地高速缓存的发生因果关系。,按下喂。,下面是BASIC改写者适应者的信号的有几分。

public class BaseViewHolder extends RecyclerView.ViewHolder {

private Object[] mIdsAndViews = new 男朋友〔0〕

/**

* 设置呼应点击事变,假设可点击设置为true,,在{@勾住 BaseAdapter#setOnItemClickListener(OnItemClickListener)}

* 您将达到呼应事变的回调。,关系到详细通知,请参阅{@勾住。 BaseAdapter#setOnItemClickListener(OnItemClickListener)}

* @param id 检查单击事变的呼应 Id

* @param clickable 单击事变的真实呼应,false对单击事变不注意呼应。

*/

public BaseViewHolder setClickable(@IdRes int id, boolean 可点击的

View view = 查找(ID)

if (看待) != 空)

if (可点击的

(mOnClickListener);

}else{

(空)

}

}

return this;

}

/**

* 按照礼物ID查找类似的看待窗口小部件

* @param viewId View id

* @param 孩童视角的使具有特性典型

* @return 来回与礼物ID对立应的子看待窗口小部件。,假设不注意,和来回空值

*/

@CheckResult

public T find(@IdRes int viewId){

int indexToAdd = -1;

for (int) i = 0; i < mIdsAndViews.length; i+=2) {

Integer id = (圆整数) mIdsAndViews[i];

if (身份证 != null &;&; id == viewId){

return (T) mIdsAndViews[i+1];

}

if (身份证 == 空)

indexToAdd = i;

}

}

if (indexToAdd == -1){

indexToAdd = mIdsAndViews.length;

mIdsAndViews = Arrays.copyOf(mIdsAndViews,

indexToAdd < 2 ? 2 : indexToAdd * 2);

}

mIdsAndViews[indexToAdd] = viewId;

mIdsAndViews[indexToAdd+1] = (看待)Id);

return (T) mIdsAndViews[indexToAdd+1];

}

}

接下来,让人们来看一眼BaseMultAdvad中所做的任务。

public abstract class BaseMultiAdapter extends BaseAdapter {

@Override

public int getLayoutRes(int) 装备线索) {

final IMultiItem data = (装备线索);

return data.getLayoutRes();

}

@Override

public void convert(BaseViewHolder holder, IMultiItem data, int 装备线索) {

(持有人)

}

}

为了地面有信号吗?,因恶劣的信号都是在BaseAdvor中变卖的。,
在喂人们找到了无论什么人imuliTIAL。,让人们看一眼它们的源信号。

public interface IMultiItem {

/**

* 对不寻常的典型的签订协议应用不寻常的的布局纸,

* 即若他们的布局是俱的。,准备排印的书面材料不已。。

* @return 来回签订协议对应的布局ID

*/

@LayoutRes int getLayoutRes();

/**

* 停止通知处置,显示译文,图片等

* @param holder Holder Helper

*/

void convert(BaseViewHolder 持有者)

/**

* 布局是{@勾住。 android.support.v7.widget.GridLayoutManager}时才有使用,

* 来回礼物布局雇用的SigScript巨大。

* @return 假设SpanSize复发了 <= 0 或许 > {@link GridLayoutManager#getSpanCount()}

* 和{@勾住 BaseAdapter} 会在{@勾住 BaseAdapter#onAttachedToRecyclerView(RecyclerView)}

* 自适应到1或{@勾住 GridLayoutManager#getSpanCount()},关系到详细通知,请参阅{@勾住。 BaseAdapter#onAttachedToRecyclerView(RecyclerView)}

*/

int getSpanSize();

}

public abstract class BaseAdapter extends {

protected final List mData = new ArrayList<>();

private BaseViewHolder.OnItemClickListener mOnItemClickListener;

@Override

public BaseViewHolder onCreateViewHolder(ViewGroup parent, int layoutRes) {

BaseViewHolder baseViewHolder = new BaseViewHolder((())

.inflate(layoutRes, parent, 假)

bindData(baseViewHolder,layoutRes);

return baseViewHolder;

}

@Override

public final void onBindViewHolder(BaseViewHolder holder, int 位) {

//通知布局

final T data = (位);

变流器(遵守器), data, 位);

}

@Override

public final int getItemCount() {

return mData.size();

}

@Override

public int getItemViewType(int) 位) {

return getLayoutRes(位);

}

@Override

public void onAttachedToRecyclerView(RecyclerView recyclerView) {

(recyclerView);

RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();

if (策士) == null || !(策士) instanceof GridLayoutManager)) return;

final GridLayoutManager gridLayoutManager = (GridLayoutManager) manager;

(新的 GridLayoutManager.SpanSizeLookup() {

@Override

public int getSpanSize(int) 位) {

final T data = getData(位);

if (通知) != null &;&; data instanceof IMultiItem){

int spanSize = ((IMultiItem)data).getSpanSize();

return spanSize <= 0 ? 1 :
spanSize > ()?

():spanSize;

}

return 1;

}

});

}

protected void bindData(BaseViewHolder baseViewHolder, int layoutRes) {

(新的 OnItemClickListener() {

@Override

public void onItemClick(@NonNull View view, int adapterPosition) {

if (mOnItemClickListener != 空)

(看待), adapterPosition);

}

}

});

bind(baseViewHolder, layoutRes);

}

/**

* 来回布局布局

*/

@LayoutRes

public abstract int getLayoutRes(int) 装备线索);

/**

* 设置指示剂在喂。

*/

public abstract void convert(BaseViewHolder holder, T data, int 装备线索);

/**

* 翻开看待点击事变,或对立的事物显示器

*/

public abstract void bind(BaseViewHolder holder,int layoutRes);

}

人们可以在喂注意到。,根本改写者适应者先前编译了恶劣的信号。,就停止getLayoutRes,convert,绑定变卖亚纲。,而它的亚纲BaseMultiAdapter直的把getLayoutRes和convert丢给了IMultiItem去变卖。
GETLayouTres是来回项瞄准布局纸ID。,同时,它也被用在ViewType的BaseAdvor中。,因而假设它是无论什么人不寻常的典型的签订协议,不提议共享同样的的布局纸。。
因而,人们的通知类仅有的由IMultItIt交流变卖。,诸如,下面的译文类签订协议。

public class Text implements IMultiItem{

public String mText;

private int mSpanSize;

public 译文(字母行) text,int spanSize) {

mText = text;

mSpanSize = spanSize;

}

@Override

public int getLayoutRes() {

return R.layout.item_text;

}

@Override

public void convert(BaseViewHolder 持有者) {

();

}

@Override

public int getSpanSize() {

return mSpanSize;

}

}

把getLayoutRes跟convert掌管IMultiItem处置的腰槽执意变卖多布局列表变得很复杂,通知对应于它们的布局纸。,用替换办法显示通知。

源码

尽量的上述的信号都在我的开源库中。,无论什么人封装了有些人经用效能的库:SherlockAdapter
冠词当然啦复杂。,更妥的学习办法是视野源信号。,假设你相似的的话。,给我的GITHUB附带说明一星。,或许更妥地目前的提议。。


超过是什么优雅地变卖改写者适应者多排列表的满足的,更多
布局优雅Adapter变卖什么列表
的满足的,请应用搜索效能获取相关性通知。。

本文满足的由互联网网络用户无意识的奉献各自向上负载,为了网站不主宰尽量的权。,不注意人工控制编辑软件。,都不的承当类似的法律责任。。假设你查明为了社区有无论什么不可靠的的消散,迎将发送邮政到:zixun-group@ 停止小窍门,并装备相关性显示。,任务人员将在5个任务日内与您润色。,一经证明,本站将毫不迟疑删去涉嫌民事侵权行为满足的。。

发表评论

电子邮件地址不会被公开。 必填项已用*标注