带你过一遍Android 多主题框架——MagicaSakura

带你过一遍Android 多主题框架——MagicaSakura本文介绍了 Android 多主题框架 MagicaSakura 的使用 包括其优点 主题切换 适配器和 ViewHolder 的配置

大家好,欢迎来到IT知识分享网。

  • 列表内容
  • 列表内容
  • 支持白天彩色主题和夜间主题。
  • 切换主题不需要重建activity
  • 提供TintXXX控件适配不同的主题,更方便更快捷。
  • 只需写一个drawable.xml 或者 layout.xml 就能自动适配到不同主题样式。
  • 兼容4.0.3以上
  • 易于集成到你的app。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <com.bilibili.magicasakura.widgets.TintToolbar  android:id="@+id/toolbar" style="@style/Widget.App.Toolbar" android:layout_width="match_parent" android:layout_height="56dp" android:background="@color/theme_color_primary" app:elevation="4dp"> <TextView  android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center_vertical" android:paddingLeft="@dimen/padding" android:text="@string/app_name" android:textColor="@color/white" android:textSize="22sp" /> </com.bilibili.magicasakura.widgets.TintToolbar> <android.support.v7.widget.RecyclerView  android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="56dp" /> <!--底部进行提示--> <include layout="@layout/fragment_layout_snack" /> </FrameLayout>

对应Main怎么进入入口

//设置title Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setTitle(null); //设置中间竖直可滑动部分 RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler); LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setSmoothScrollbarEnabled(true); //进行分割线的操作 recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() { @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { //8dp final int padding = getResources().getDimensionPixelOffset(R.dimen.padding_half); //返回适配器条目的位置 RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) view.getLayoutParams(); final int position = layoutParams.getViewLayoutPosition(); if (position == 0) { outRect.left = outRect.top = outRect.right = padding; outRect.bottom = padding >> 1; } else if (position == state.getItemCount() - 1) { outRect.left = outRect.bottom = outRect.right = padding; outRect.top = padding >> 1; } else { outRect.left = outRect.right = padding; outRect.top = outRect.bottom = padding >> 1; } } }); //设置进行水平还是垂直 recyclerView.setLayoutManager(layoutManager); //设置适配器 Adapter adapter = new Adapter(); recyclerView.setAdapter(adapter); //适配器添加HolderType adapter.addViewHolderType( ViewHolder.VIEW_HOLDER_HEADER, ViewHolder.VIEW_HOLDER_LABEL, ViewHolder.VIEW_HOLDER_HEADER, ViewHolder.VIEW_HOLDER_LOGIN, ViewHolder.VIEW_HOLDER_HEADER, ViewHolder.VIEW_HOLDER_DOWNLOAD );
这里明白一个知识点
  1. 关于Rect outRect这个参数
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() { @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { } }

在这个参数中Rect outRect这个矩形控制条目的显示
– outRect.left : 控制条目距离左边的距离
– outRect.right:条目距离右边的距离
– outRect.top : 条目距离上边的距离
– outRect.bottom : 条目距离下边的距离

  1. 关于padding >> 1

相当于 padding/2的值

接下来我们就看看适配器
public static class Adapter extends RecyclerView.Adapter<ViewHolder> { 
    List<Integer> viewHolderTypes = new ArrayList<>();//视图类型 SparseArrayCompat<Integer> titleIndexs = new SparseArrayCompat<>();//标题集合 @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return ViewHolder.create(parent, viewType);根据类型创建每一个条目 } @Override public void onBindViewHolder(ViewHolder holder, int position) { //将数据绑定到item视图上 if (holder instanceof ViewHolderHeader) { ((ViewHolderHeader) holder).setTitle(titleIndexs.get(position)); } } //条目集合数 @Override public int getItemCount() { return viewHolderTypes.size(); } //根据位置得到type信息 @Override public int getItemViewType(int position) { return viewHolderTypes.get(position); } // public void addViewHolderType(int... type) { for (int i = 0; i < type.length; i++) { if (type[i] == ViewHolder.VIEW_HOLDER_HEADER) { titleIndexs.put(i, titleIndexs.size() + 1); } viewHolderTypes.add(type[i]); } notifyDataSetChanged(); } }

对于适配器,最次也要实现以下几个方法

//onCreateViewHolder()负责为Item创建视图 @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return null; } //onBindViewHolder()负责将数据绑定到Item的视图上 @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {} //条目个数 @Override public int getItemCount() { return 0; }

根据type创建对应的ViewHolder

public static abstract class ViewHolder extends RecyclerView.ViewHolder { 
    public static final int VIEW_HOLDER_HEADER = 0; public static final int VIEW_HOLDER_LABEL = VIEW_HOLDER_HEADER + 1; public static final int VIEW_HOLDER_LOGIN = VIEW_HOLDER_LABEL + 1; public static final int VIEW_HOLDER_DOWNLOAD = VIEW_HOLDER_LOGIN + 1; public ViewHolder(View itemView) { super(itemView); } public static ViewHolder create(ViewGroup viewHolder, int type) { switch (type) { case VIEW_HOLDER_HEADER: return ViewHolderHeader.create(viewHolder);//[1.1] case VIEW_HOLDER_LABEL: return ViewHolderLabel.create(viewHolder); case VIEW_HOLDER_LOGIN: return ViewHolderLogin.create(viewHolder); 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/158088.html

(0)
上一篇 2025-01-26 16:00
下一篇 2025-01-26 16:05

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信