MultiType的学习总结

2020-11-13  本文已影响0人  132xin
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);
    }

}
上一篇 下一篇

猜你喜欢

热点阅读