MultiType的简单介绍
MultiType是一个多类型的列表视图的中间分发框架,MultiType能够轻松地解决不同的Item类型的问题,随时可扩展新的类型加入到列表中,它内建了类型-View的复用池系统,支持RecyclerView,使用简单,代码模块化,适应需求的变化。
使用:
在gradle中加入依赖:
//multitype
implementation'com.drakeet.multitype:multitype:4.2.0'
implementation 'com.drakeet.about:about:2.4.1'
MultiType这个框架使用RecycleView,但是不需要写Adapter,需要写ItemViewBinder,在多种Type下,每一个Item对应一个数据模型和一个ItemViewBinder。
新建一个数据模型Data
public class SinglePlayListData {
private PlayListBean playListBean;
public SinglePlayListData(PlayListBean playListBean) {
this.playListBean = playListBean;
}
public PlayListBean getPlayListBean() {
return playListBean;
}
public void setPlayListBean(PlayListBean playListBean) {
this.playListBean = playListBean;
}
}
新建一个ItemView,对应的上面的数据模型
public class SingPlayListItemView extends ItemViewBinder<SinglePlayListData, SingPlayListItemView.ViewHolder> {
private Context mContext;
public SingPlayListItemView(Context context) {
this.mContext = context;
}
@NotNull
@Override
public ViewHolder onCreateViewHolder(@NotNull LayoutInflater layoutInflater, @NotNull ViewGroup viewGroup) {
View view = layoutInflater.inflate(R.layout.single_play_list_view, null, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NotNull ViewHolder viewHolder, SinglePlayListData singlePlayListData) {
viewHolder.recyclerView.setAdapter(new RecycleViewAdapter(singlePlayListData.getPlayListBean().getPlaylist().getTracks()));
//设置横向移动
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext);
linearLayoutManager.setOrientation(RecyclerView.HORIZONTAL);
viewHolder.recyclerView.setLayoutManager(linearLayoutManager);
}
public class ViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.recycle_view)
RecyclerView recyclerView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
class RecycleViewAdapter extends RecyclerView.Adapter<RecycleViewAdapter.ViewHolder> {
private List<PlayListBean.PlaylistBean.TracksBean> list;
public RecycleViewAdapter(List<PlayListBean.PlaylistBean.TracksBean> tracks) {
list = tracks;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.recycle_view_song_item, null, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
String imageUrl = list.get(position).getAl().getPicUrl();
GlideUtill.LoadingRoundRect(mContext, imageUrl, holder.imageView, 10);
String temp = list.get(position).getAl().getName() + "-" + list.get(position).getAr().get(0).getName();
holder.textView.setText(temp);
}
@Override
public int getItemCount() {
return list != null ? list.size() : 0;
}
public class ViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.image_view)
ImageView imageView;
@BindView(R.id.song_name)
TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
}
}
因为这个是从个人项目中拿出来的一个类,最重要的是需要继承 ItemViewBinder<SinglePlayListData, SingPlayListItemView.ViewHolder>,并且制定泛型的具体类,其中ViewHolder我们可以定义成内部类,重新两个最重要的方法,onCreateViewHolder和onBindViewHolder,这个两个方法是最重要的两个方法。
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
onCreateViewHolder方法是根据布局创建View的,然后实例化ViewHolder,并且返回。
public void onBindViewHolder(@NotNull ViewHolder viewHolder, SinglePlayListData singlePlayListData)
这个方法传递过来的参数是ViewHolder和对应的数据模型,在方法可以实现对界面的元素做赋值的操作,使数据与View进行绑定。
接下来就是进行注册Item和设置到RecycleView的Adpater。
mRecyclerView = view.findViewById(R.id.recycle_view);
multiTypeAdapter = new MultiTypeAdapter();
multiTypeAdapter.register(SinglePlayListData.class, new SingPlayListItemView(context));
mRecyclerView.setLayoutManager(new
LinearLayoutManager(getContext()));
Items items=new Items();
items.add(new SingSongItemData(playlistBean));
multiTypeAdapter.setItems(items);
mRecyclerView.setAdapter(multiTypeAdapter);
上面的 Items items=new Items();其实是一个ArrayList<Object>,只是进一步封装了。
public class Items extends ArrayList<Object> {
public Items() {
super();
}
public Items(int initialCapacity) {
super(initialCapacity);
}
public Items(Collection<?> c) {
super(c);
}
}
网友评论