AbsAdapter 是一个积木化的Adapter
- 使用AbsAdapter,不同样式的Item将可以自由组合
- 使用AbsAdapter,每个Item样式都将被独立出来
- 使用AbsAdapter,将来需要增加或减少样式将变得很简单
- 使用AbsAdapter,Adapter的代码将变得很简洁
- 最关键的是,每一个item样式可以被ListView 或 RecyclerView 共用,而不需要修改任何逻辑
- 如果你觉得我的代码对你有帮助,请麻烦您在右上角给我一个
star
. - 如过你对我的代码有任何疑问或者发现任何bug,麻烦您在issues告诉我
compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.arialyy.absadapter:AbsAdapter:1.1.2'
为了防止gradle编译失败,你还需要在app 的 build.gradle 文件的android{}
块中添加以下代码
android{
...
packagingOptions {
exclude 'META-INF/services/javax.annotation.processing.Processor'
}
}
- TestAdapter_1
public class RvAdapter_1 extends AbsRvDAdapter<AbsDEntity> {
public RvAdapter_1(Context context, List<AbsDEntity> data, FragmentManager fm) {
super(context, data);
getManager().addDelegate(new BannerDelegate(context, this, fm));
getManager().addDelegate(new RvGameDetailDelegate(context, this));
getManager().addDelegate(new RvGameNotifyDelegate(context, this));
}
}
- TestAdapter_2
public class RvAdapter_2 extends AbsRvDAdapter<AbsDEntity> {
public RvAdapter_2(Context context, List<AbsDEntity> data, FragmentManager fm) {
super(context, data);
getManager().addDelegate(new BannerDelegate(context, this, fm));
getManager().addDelegate(new RvGameDetailDelegate(context, this));
getManager().addDelegate(new RvGameNotifyDelegate(context, this));
getManager().addDelegate(new TextDelegate(context, this));
getManager().addDelegate(new ImgDelegate(context, this));
}
}
- TestAdapter_3
public class RvAdapter_3 extends AbsRvDAdapter<AbsDEntity> {
public RvAdapter_3(Context context, List<AbsDEntity> data) {
super(context, data);
getManager().addDelegate(new RvGameDetailDelegate(context, this));
getManager().addDelegate(new RvGameNotifyDelegate(context, this));
}
}
如上图及代码所示,在Adapter 里面 item样式 可以像积木一样被自由组合并且可以随意增加或减少
1、 创建一个实体,并继承AsbDEntity,然后通过@AbsType
注解,让实体和Delegate绑定。
ps:实体和Delegate是通过编译时的注解绑定的,使用AbsType注解,不会影响你列表的性能。
@AbsType(type = Constance.ADAPTER_TYPE.TYPE_GAME_DETAIL, delegate = GameDetailDelegate.class)
public class GameDetailEntity extends AbsDEntity{
String imgUrl;
String title;
String detail;
}
2、 创建一个Item样式,每一个Item样式都有独立的 Holder,因此,你还需要创建相应的Holder
/**
* 创建
*/
public class TextDelegate extends AbsDelegation<TextEntity, TextDelegate.LvTextHolder> {
public TextDelegate(Context context, AbsIAdapter adapter, int itemType) {
super(context, adapter, itemType);
}
@Override
public LvTextHolder createHolder(View convertView) {
return new LvTextHolder(convertView);
}
/**
* 绑定你的数据
*/
@Override
public void bindData(int position, TextDelegate.LvTextHolder helper, TextEntity item) {
helper.mText.setText(item.getText());
}
/**
* 设置布局id
*/
@Override
public int setLayoutId() {
return R.layout.item_text;
}
/**
* 创建Delegate对应的Holder
*/
public class LvTextHolder extends AbsHolder {
@InjectView(R.id.text)
TextView mText;
public LvTextHolder(View itemView) {
super(itemView);
}
}
}
现在,你已经拥有了一个模块化的Item
3、 创建ListView Adapter 或者 RecyclerView Adapter
注意 :
- 如果你的列表是ListView,你需要继承
AbsLvDAdapter
- 如果你的列表是RecyclerView,你需要继承
AbsRvDAdapter
AbsLvDAdapter
或者AbsRvDAdapter
可以共用一个Item样式
/**
* RecyclverView 的Adapter
*/
public class RvAdapter extends AbsRvDAdapter<AbsDEntity> {
public RvAdapter(Context context, List<AbsDEntity> data) {
super(context, data);
//在Adapter 中注册你需要的 Item 样式
getManager().addDelegate(new TextDelegate(context, this));
}
}
/**
* ListerView 的Adapter
*/
public class LvAdapter extends AbsLvDAdapter<AbsDEntity> {
public LvAdapter(Context context, List<AbsDEntity> data) {
super(context, data);
//在Adapter 中注册你需要的 Item 样式, 1 为你 在对应的实体通过重载“getAbsType”设置的参数
getManager().addDelegate(new TextDelegate(context, this));
}
}
对于RecyclerView 的 item点击监听。
现在,你可以使用以下方法来设置Item点击事件,避免Adapter恶心的事件传递:
- Item点击事件
RvItemClickSupport.addTo(recyclerView).setOnItemClickListener(new RvItemClickSupport.OnItemClickListener() {
@Override
public void onItemClicked(RecyclerView recyclerView, int position, View v) {
//处理你的事件
});
- Item长按事件
RvItemClickSupport.addTo(recyclerView).setOnItemLongClickListener(new RvItemClickSupport.OnItemLongClickListener() {
@Override
public boolean onItemLongClicked(RecyclerView recyclerView, int position, View v) {
//处理你的事件
return false;
}
});
- Item 触摸事件
RvItemClickSupport.addTo(mList).setOnItemTouchListener(new RvItemClickSupport.OnItemTouchListener() {
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e, int position, View v) {
//处理你的事件
}
});
- 1.1.3 butterknife由6.1.0 ==> 7.0.1,RvItemClickSupport增加焦点事件监听
- 1.1.1 增加删除样式功能
Copyright 2016 AriaLyy (AbsAdapter)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.