资讯专栏INFORMATION COLUMN

Android自定义View:快递时间轴实现

王陆宽 / 2693人阅读

摘要:设置自定义分割线至此自定义就实现完成了参考文章自定义实战系列时间轴欢迎关注作者更多干货等你来拿哟请赏个小红心因为你的鼓励是我写作的最大动力更多精彩文章请关注个人博客掘金简书慕课网手记

前言

在Android开发中,时间轴的 UI非常常见,如下图:

储备知识:

1.自定义view基础
2.RecyclerView的使用
3.自定义RecyclerView.ItemDecoration

具体实现

1.最终效果如下:

2.实现思路

使用RecyclerView,自定义RecyclerView.ItemDecoration

复习ItemDecoration中getItemOffsets()方法,重写onDraw()方法

实现RecyclerView.Adapter,绑定数据

3.详细设计

4.具体实现

引入RecyclerView依赖包

dependencies {
     ..........
    api "com.android.support:recyclerview-v7:28.0.0"
}

在布局文件中使用



    


设置item布局



    

    

实现RecyclerView.Adapter

public class MyAdapter extends RecyclerView.Adapter {
    private LayoutInflater inflater;
    private ArrayList> listitem;

    //构造函数,传入数据
    public MyAdapter(Context context,ArrayList> listitem) {
        this.inflater = LayoutInflater.from(context);
        this.listitem = listitem;
    }

    class ViewHolder extends RecyclerView.ViewHolder{
        private TextView title,text;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.item_title);
            text = itemView.findViewById(R.id.item_text);
        }

        public TextView getTitle() {
            return title;
        }

        public TextView getText() {
            return text;
        }


    }



    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        return new ViewHolder(inflater.inflate(R.layout.list_cell,null));
        //绑定item布局
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
          //绑定数据到ViewHolder
        ViewHolder  vh = (ViewHolder) viewHolder;
        vh.title.setText((CharSequence) listitem.get(i).get("ItemTitle"));
        vh.text.setText((CharSequence) listitem.get(i).get("ItemText"));
    }

    @Override
    public int getItemCount() {
        return listitem.size();
    }
}

自定义RecyclerView.ItemDecoration

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    //轴点画笔
    private final Paint mPaint;
    //时分画笔
    private final Paint mPaint1;
    //年月画笔
    private final Paint mPaint2;
    //itemView 左 上 偏移量
    private int itemView_leftinterval;
    private int itemView_topintervarl;
    //轴点半径
    private  int circle_radius;
    private final Bitmap mIcon;


    //在构造函数里初始化需要属性
    public DividerItemDecoration(Context context){
        mPaint = new Paint();
        mPaint.setColor(Color.RED);//设置画笔颜色为红色

        mPaint1 = new Paint();
        mPaint1.setColor(Color.BLUE);
        mPaint1.setTextSize(30);//设置绘制字体大小

        mPaint2 = new Paint();
        mPaint2.setColor(Color.BLUE);
        mPaint2.setTextSize(15);

        itemView_leftinterval = 200; //左偏移长度200
        itemView_topintervarl = 50; //上偏移长度50

        circle_radius = 10;//轴点半径为10
        mIcon = BitmapFactory.decodeResource(context.getResources(),R.mipmap.logo);

    }

    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);

        //设置itemview的左上偏移量,即为onDraw可绘制的区域
        outRect.set(itemView_leftinterval,itemView_topintervarl,0,0);

    }

    @Override
    public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.onDraw(c, parent, state);

        //获取RecyclerView的Child的个数
        int childCount = parent.getChildCount();
        //遍历每个item,分别获取他们的位置信息,然后在绘制对应的分割线
        for (int i=0;i

初始化数据,绑定RecyclerView

public class MainActivity extends AppCompatActivity {

    private ArrayList> itemlist;
    private RecyclerView rl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        initView();
    }

    private void initData() {
        itemlist = new ArrayList>();
        HashMap map1 = new HashMap();
        HashMap map2 = new HashMap();
        HashMap map3 = new HashMap();
        HashMap map4 = new HashMap();
        HashMap map5 = new HashMap();
        HashMap map6 = new HashMap();


        map1.put("ItemTitle", "中国广州公司已发出");
        map1.put("ItemText", "发件人:妙卡迪文化公司");
        itemlist.add(map1);

        map2.put("ItemTitle", "国际顺丰已收入");
        map2.put("ItemText", "等待中转");
        itemlist.add(map2);

        map3.put("ItemTitle", "国际顺丰转件中");
        map3.put("ItemText", "下一站中国");
        itemlist.add(map3);

        map4.put("ItemTitle", "中国顺丰已收入");
        map4.put("ItemText", "下一站江苏理工大学");
        itemlist.add(map4);

        map5.put("ItemTitle", "中国顺丰派件中");
        map5.put("ItemText", "等待派件");
        itemlist.add(map5);

        map6.put("ItemTitle", "江苏理工大学已签收");
        map6.put("ItemText", "收件人:darryrzhong");
        itemlist.add(map6);

    }

    private void initView() {
        rl = findViewById(R.id.my_recycler_view);
        LinearLayoutManager manager = new LinearLayoutManager(this);
        rl.setLayoutManager(manager);
        //当知道Adapter内Item的改变不会影响RecyclerView宽高的时候,可以设置为true让RecyclerView避免重新计算大小。
        rl.setHasFixedSize(true);
        rl.addItemDecoration(new DividerItemDecoration(this));//设置自定义分割线
        MyAdapter adapter =  new MyAdapter(this,itemlist);
        rl.setAdapter(adapter);
    }
}

至此,自定义RecyclerView就实现完成了.

参考文章:

Android 自定义View实战系列 :时间轴

欢迎关注作者darryrzhong,更多干货等你来拿哟.

请赏个小红心!因为你的鼓励是我写作的最大动力!
更多精彩文章请关注

个人博客:darryrzhong

掘金

简书

SegmentFault

慕课网手记

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/14843.html

相关文章

  • 定义控件及效果

    摘要:实现炫酷的登录效果美观,动画效果丰富风格底部选择器支持时间,日期,自定义带来一组风格底部选择器控件,虽然我们不提倡安卓使用风格的控件,但是难免有些产品和美工一味追求风格。 Android 动画效果定值范围选择控件 实现固定值的范围选择, 并添加动态效果, 使用方便 项目需求讨论 - Android 自定义 Dialog 实现步骤及封装 根据实际项目需求出发。因为项目中的对话框要配合整个...

    刘德刚 评论0 收藏0
  • android各种效果库

    摘要:你被下拉刷新和上拉加载搞烦了吗下拉刷新和上拉加载的库多如牛毛,你为何还要再造一个轮子是的,这方面的库确实多到看不过来,但是却没有找到一个能够内部判断是下拉刷新还是上拉加载,处理空白页面错误页面,并且维护了的轮子。 可能是最优雅的切换布局的方法 动态切换布局控件 android 实现画板功能 本例详细分析了一个画板功能的实现过程,并讲述了图像混合和双缓冲技术的基本原理。 有关Activi...

    shaonbean 评论0 收藏0
  • Android-定义View

    摘要:自定义简单实现凹凸优惠券效果自定义属性的简单使用,继承重写方法使用来绘制,简单实现凹凸优惠券效果图文并茂自定义之切换标签自定义实现一个简单好用的切换标签自定义滑动确认控件自定义控件,用来进行滑动确认等操作。 Android 之自定义 View 的死亡三部曲之 Measure 我还不知道你的三围呢(你要占多少屏幕),我怎么能轻易让你出场呢? Android 自定义 View,ViewGr...

    UnixAgain 评论0 收藏0
  • Android 定义 View - 收藏集 - 掘金

    摘要:在本篇文安卓自定义进阶分类和流程掘金自定义分类与流程经历过前面三篇啰啰嗦嗦的基础篇之后,终于到了进阶篇,正式进入解析自定义的阶段。 Android 从 0 开始自定义控件之 View 的 draw 过程 (九) - Android - 掘金转载请标明出处: http://blog.csdn.net/airsaid/... 本文出自:周游的博客 ... Andriod 从 0 开始自定义...

    AndroidTraveler 评论0 收藏0
  • Android 定义View - 收藏集 - 掘金

    摘要:在本篇文安卓自定义进阶分类和流程掘金自定义分类与流程经历过前面三篇啰啰嗦嗦的基础篇之后,终于到了进阶篇,正式进入解析自定义的阶段。 这交互炸了(二):爱范儿是如何让详情页缩小为横向列表的 - 掘金本文同步自wing的地方酒馆 写在前面:写这段话的时候,已经是夜里3点了。别问我为什么这么拼,一切为了与你分享干货!!!! 不要太感动,擦擦眼泪继续往下看。 本开源库链接 Expandable...

    yanbingyun1990 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<