实现RecyclerView 的通用Adapter
来源:互联网 发布:手机安全中心软件 编辑:程序博客网 时间:2024/06/01 19:56
RecyclerView虽然很好,但是却需要为每一个RecyclerView实现一个Adapter,而没有像BaseAdap那样的通用Adapter,下面就来实现一个通用的Adapter:
①首先实现一个BaseViewHolder
public class BaseViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private SparseArray<View> views;
private BaseAdapter.OnItemClickListener mOnItemClickListener ;
public BaseViewHolder(View itemView,BaseAdapter.OnItemClickListener onItemClickListener){
super(itemView);
itemView.setOnClickListener(this);
this.mOnItemClickListener =onItemClickListener;
this.views = new SparseArray<View>();
}
public TextView getTextView(int viewId) {
return retrieveView(viewId);
}
public CheckBox getCheckBox(int viewId) {
return retrieveView(viewId);
}
public Button getButton(int viewId) {
return retrieveView(viewId);
}
public ImageView getImageView(int viewId) {
return retrieveView(viewId);
}
public View getView(int viewId) {
return retrieveView(viewId);
}
protected <T extends View> T retrieveView(int viewId) {
View view = views.get(viewId);
if (view == null) {
view = itemView.findViewById(viewId);
views.put(viewId, view);
}
return (T) view;
}
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(v,getLayoutPosition());
}
}
}
②实现BaseAdapter
public abstract class BaseAdapter<T,H extends BaseViewHolder> extends RecyclerView.Adapter<BaseViewHolder>{
protected static final String TAG = BaseAdapter.class.getSimpleName();
protected final Context context;
protected int layoutResId;
protected List<T> datas;
private OnItemClickListener mOnItemClickListener = null;
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
public BaseAdapter(Context context, int layoutResId) {
this(context, layoutResId, null);
}
public BaseAdapter(Context context, int layoutResId, List<T> datas) {
this.datas = datas == null ? new ArrayList<T>() : datas;
this.context = context;
this.layoutResId = layoutResId;
}
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View view = LayoutInflater.from(viewGroup.getContext())
.inflate(layoutResId, viewGroup, false);
BaseViewHolder vh = new BaseViewHolder(view,mOnItemClickListener);
return vh;
}
@Override
public void onBindViewHolder(BaseViewHolder viewHoder, int position) {
T item = getItem(position);
convert((H)viewHoder, item);
}
@Override
public int getItemCount() {
if(datas==null || datas.size()<=0)
return 0;
return datas.size();
}
public T getItem(int position) {
if (position >= datas.size()) return null;
return datas.get(position);
}
public void clear(){
if(datas==null || datas.size()<=0)
return;
for (Iterator it=datas.iterator();it.hasNext();){
T t = (T) it.next();
int position = datas.indexOf(t);
it.remove();
notifyItemRemoved(position);
}
}
public void removeItem(T t){
int position = datas.indexOf(t);
datas.remove(position);
notifyItemRemoved(position);
}
public List<T> getDatas(){
return datas;
}
public void addData(List<T> datas){
addData(0,datas);
}
public void addData(int position,List<T> list){
if(list !=null && list.size()>0) {
for (T t:list) {
datas.add(position, t);
notifyItemInserted(position);
}
}
}
public void refreshData(List<T> list){
clear();
if(list !=null && list.size()>0){
int size = list.size();
for (int i=0;i<size;i++){
datas.add(i,list.get(i));
notifyItemInserted(i);
}
}
}
public void loadMoreData(List<T> list){
if(list !=null && list.size()>0){
int size = list.size();
int begin = datas.size();
for (int i=0;i<size;i++){
datas.add(list.get(i));
notifyItemInserted(i+begin);
}
}
}
protected abstract void convert(H viewHoder, T item);
}
③实现一个SimpleAdapter,类似于ListView的BaseAdapter
public abstract class SimpleAdapter<T> extends BaseAdapter<T,BaseViewHolder> {
public SimpleAdapter(Context context, int layoutResId) {
super(context, layoutResId);
}
public SimpleAdapter(Context context, int layoutResId, List<T> datas) {
super(context, layoutResId, datas);
}
}
④使用
public class AddressAdapter extends SimpleAdapter<Address> {
private AddressLisneter lisneter;
public AddressAdapter(Context context, List<Address> datas,AddressLisneter lisneter) {
super(context, R.layout.template_address,datas);
this.lisneter = lisneter;
}
@Override
protected void convert(BaseViewHolder viewHoder, final Address item) {
viewHoder.getTextView(R.id.txt_name).setText(item.getConsignee());
viewHoder.getTextView(R.id.txt_phone).setText(replacePhoneNum(item.getPhone()));
viewHoder.getTextView(R.id.txt_address).setText(item.getAddr());
final CheckBox checkBox = viewHoder.getCheckBox(R.id.cb_is_defualt);
final boolean isDefault = item.getIsDefault();
checkBox.setChecked(isDefault);
if(isDefault){
checkBox.setText("默认地址");
}
else{
checkBox.setClickable(true);
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked && lisneter !=null){
item.setIsDefault(true);
lisneter.setDefault(item);
}
}
});
}
}
public interface AddressLisneter{
public void setDefault(Address address);
}
}
只需实现convert方法即可。
- 实现RecyclerView 的通用Adapter
- 通用的RecyclerView Adapter适配器
- 打造 RecyclerView的 通用Adapter
- 通用的recyclerview adapter 适配
- RecyclerView通用adapter以及item点击事件的实现
- RecyclerView.Adapter的实现
- 打造通用的RecyclerView的Adapter
- 打造AbsListView、RecyclerView的通用Adapter
- 打造通用的Adapter为RecyclerView服务
- mvvm模式的recyclerview通用adapter
- RecyclerView通用适配器Adapter,对Adapter的封装
- RecyclerView 的 RecyclerView.Adapter 通用版的实现
- RecyclerView通用适配器的实现
- RecyclerView通用Adapter与ViewHolder
- 为RecyclerView打造通用adapter
- 为RecyclerView打造通用Adapter
- Android RecyclerView设计通用Adapter
- 为RecyclerView打造通用Adapter
- 删数问题 贪心
- LocalAuthentication
- C++中typeid的用法
- 项目52-XML解析的银行管理系统
- runtime之归档反归档
- 实现RecyclerView 的通用Adapter
- Coreseek算法分析
- Android 自定义Dialog,文字动态加载效果。
- 大数阶乘
- java 中equals与 ==的区别
- 面向对象总结(一)
- Validate Binary Search Tree
- 安卓开机LOGO动画
- LeetCode之18_4Sum