实现原理就是封装了一下原生适配的方式,让我们使用起来更加方便灵活
//自定义适配器
public abstract class BaseAdapter<T> extends RecyclerView.Adapter<BaseAdapter.BaseViewHolder> {
private List<T> list=new ArrayList<>();
private iRecyclerItemClickListener recyclerItemClickListener;
//添加数据
public void updateData(List<T> updateList){
this.list.clear();
this.list.addAll(updateList);
notifyDataSetChanged();
}
//删除数据
public void delData(int position){
list.remove(position);
notifyDataSetChanged();
}
public List<T> getUpdateData(){
return list;
}
public void setRecyclerItemClickListener(iRecyclerItemClickListener recyclerItemClickListener) {
this.recyclerItemClickListener = recyclerItemClickListener;
}
@NonNull
@Override
public BaseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View rootView = LayoutInflater.from(parent.getContext()).inflate(getLayoutId(viewType), parent, false);
return new BaseViewHolder(rootView);
}
@Override
public void onBindViewHolder(@NonNull BaseViewHolder holder, int position) {
displayViewHolder(holder,position,list.get(position));
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (recyclerItemClickListener!=null){
recyclerItemClickListener.OnItemClick(position);
}
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (recyclerItemClickListener!=null){
recyclerItemClickListener.OnItemLongClick(position);
}
return true;
}
});
}
public abstract int getLayoutId(int viewType);
public abstract void displayViewHolder(BaseViewHolder baseViewHolder, int position, T itemData);
public abstract int getRootViewType(int position);
@Override
public int getItemViewType(int position) {
return getRootViewType(position);
}
@Override
public int getItemCount() {
return list.size();
}
public static class BaseViewHolder extends RecyclerView.ViewHolder{
SparseArray<View> sparseArray=new SparseArray<>();
public BaseViewHolder(View itemView) {
super(itemView);
}
public <V extends View> V getView(int id){
if (sparseArray.get(id)!=null){
return (V) sparseArray.get(id);
}else {
V childView = itemView.findViewById(id);
sparseArray.put(id,childView);
return childView;
}
}
}
//点击事件
public interface iRecyclerItemClickListener{
void OnItemClick(int position);
void OnItemLongClick(int position);
}
}
可以传入具体的实体类,继承之后传值然后实现三个方法即可
public class HotAdapter extends BaseAdapter<GoodsBean.ResultBean.HotProductListBean> {
private Context context;
public HotAdapter(Context context) {
this.context = context;
}
@Override
public int getLayoutId(int viewType) {
return R.layout.item_kind_hot;
}
@Override
public void displayViewHolder(BaseViewHolder baseViewHolder, int position, GoodsBean.ResultBean.HotProductListBean itemData) {
ImageView iv = baseViewHolder.getView(R.id.kind_image);
TextView tv = baseViewHolder.getView(R.id.kind_money);
Glide.with(context).load(Constants.BASE_URl_IMAGE+itemData.getFigure()).placeholder(R.drawable.new_img_loading_1).into(iv);
tv.setText("¥"+itemData.getCover_price());
}
@Override
public int getRootViewType(int position) {
return 0;
}
}
也可以使用多布局的方式,更加方便灵活
public class TypeAdapter extends BaseAdapter<Object> {
private Context context;
public TypeAdapter(Context context) {
this.context = context;
}
@Override
public int getLayoutId(int viewType) {
switch (viewType){
case 0:
return R.layout.item_hot_right;
case 1:
return R.layout.item_child_right;
}
return R.layout.item_hot_right;
}
@Override
public void displayViewHolder(BaseViewHolder baseViewHolder, int position, Object itemData) {
switch (position){
case 0:
List<GoodsBean.ResultBean.HotProductListBean> hotProductListBeans = (List<GoodsBean.ResultBean.HotProductListBean>) itemData;
RecyclerView hotRv = baseViewHolder.getView(R.id.rv_hot_right);
GridLayoutManager manager = new GridLayoutManager(context,1);
manager.setOrientation(RecyclerView.HORIZONTAL);
hotRv.setLayoutManager(manager);
HotAdapter adapter = new HotAdapter(context);
hotRv.setAdapter(adapter);
adapter.updateData(hotProductListBeans);
adapter.setRecyclerItemClickListener(new iRecyclerItemClickListener() {
@Override
public void OnItemClick(int position) {
Intent intent = new Intent(baseViewHolder.itemView.getContext(), DetailsActivity.class);
intent.putExtra("img",hotProductListBeans.get(position).getFigure());
intent.putExtra("url",hotProductListBeans.get(position).getFigure());
intent.putExtra("name",hotProductListBeans.get(position).getName()+"");
intent.putExtra("price",hotProductListBeans.get(position).getCover_price());
intent.putExtra("productId",hotProductListBeans.get(position).getProduct_id());
intent.putExtra("productPrice",hotProductListBeans.get(position).getCover_price());
context.startActivity(intent);
}
@Override
public void OnItemLongClick(int position) {
}
});
break;
case 1:
List<GoodsBean.ResultBean.ChildBean> childBeans = (List<GoodsBean.ResultBean.ChildBean>) itemData;
RecyclerView goodsRv = baseViewHolder.getView(R.id.rv_child_right);
goodsRv.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
ChildAdapter goodAdapter = new ChildAdapter(context);
goodsRv.setAdapter(goodAdapter);
goodAdapter.updateData(childBeans);
break;
}
}
@Override
public int getRootViewType(int position) {
return position;
}
}