Android RecyclerView使用ItemDecoration刻画时间线/时间轴/时光轴timeline
在Android开发中时间线/时间轴/时光轴现在很常见,尤其涉及到进度、物流信息、进展和时态发展的图表信息等,时间线/时间轴/时光轴生动表现这一类需求。
在RecyclerView的基础上,我使用ItemDecoration刻画一条在RecyclerView左侧的时间线/时间轴/时光轴。运行结果如图:
在顶部显示一张与众不同的icon,区别表示事件或者进展已经完成。
下面是代码。
RVActivity.java是本例运行的Activity:
package zhangphil.test;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
public class RVActivity extends AppCompatActivity {
RecyclerViewAdapter mAdapter;
private ArrayList<Integer> mItems;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.rv_activity);
mItems = new ArrayList<>();
for (int i = 0; i < 5; i++) {
mItems.add(i);
}
RecyclerView mRecyclerView = findViewById(R.id.recycler_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(layoutManager);
mAdapter = new RecyclerViewAdapter();
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.addItemDecoration(new RVItemDecoration(getApplicationContext()));
}
private class RecyclerViewAdapter extends RecyclerView.Adapter<MyVH> {
@NonNull
@Override
public MyVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.rv_item, parent, false);
return new MyVH(view);
}
@Override
public void onBindViewHolder(@NonNull MyVH holder, int position) {
holder.title.setText("时间:" + position);
holder.content.setText("事件进度 -> " + mItems.get(position));
holder.indicator_icon.setImageResource(position == 0 ? R.mipmap.ic_launcher : R.drawable.ic_launcher_background);
}
@Override
public int getItemCount() {
return mItems.size();
}
}
private class MyVH extends RecyclerView.ViewHolder {
public TextView title;
public TextView content;
public ImageView indicator_icon;
public MyVH(View itemView) {
super(itemView);
title = itemView.findViewById(R.id.title);
content = itemView.findViewById(R.id.content);
indicator_icon = itemView.findViewById(R.id.indicator_icon);
}
}
private class RVItemDecoration extends RecyclerView.ItemDecoration {
private Paint mPaint;
public RVItemDecoration(Context context) {
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(2); //时间轴线的宽度。
mPaint.setColor(Color.BLUE); //时间轴线的颜色。
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View view = parent.getChildAt(i);
//int index = parent.getChildAdapterPosition(view);
float left = dip2px(getApplicationContext(), 14 + 10);
float bottom = view.getBottom();
c.drawLine(left, dip2px(getApplicationContext(), (50 - 20) / 2), left, bottom, mPaint);
}
}
}
public static int dip2px(Context context, float dpValue) {
float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
其中R.layout.rv_activity.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
其实就只有一个Android的RecyclerView。
RecyclerView的Adapter用到的item布局R.layout.rv_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="14dp"
android:paddingRight="14dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/indicator_icon"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_gravity="center_vertical"
android:scaleType="centerInside"
android:src="@drawable/ic_launcher_background" />
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginLeft="10dp"
android:background="@android:color/holo_blue_bright"
android:gravity="left|center_vertical"
android:text="时间"
android:textColor="@android:color/white"
android:textSize="26dp" />
</LinearLayout>
<TextView
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
android:layout_marginLeft="30dp"
android:text="事件进度"
android:textColor="@android:color/darker_gray"
android:textSize="14dp" />
</LinearLayout>
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
极具破坏性的Roaming mantis多次涉猎挖矿和网络钓鱼
2018年4月,卡巴斯基实验室发布了一篇名为“Roaming Mantis使用DNS劫持来感染Android智能手机”的博客blogpost。Roaming Mantis使用Android恶意软件,旨在通过DNS劫持进行传播并以Android设备为目标。根据我们的遥测数据,该活动主要集中在亚洲(韩国,孟加拉国和日本)。潜在的受害者被DNS劫持重定向到一个恶意网页,恶意网页发布了一个伪装成Facebook或Chrome的特洛伊应用程序,然后由用户手动安装。该应用程序实际上包含一个Android木马银行。 它引起了我们的注意,在我们发布后不久,其他研究人员也专注于这个恶意软件家族。我们发布了博客之后又发了另一份出版物。我们想感谢来自其他安全公司McAfee、TrendMicro的同事独立开展的关于这项威胁的很棒的工作。如果对这个主题感兴趣,以下文章很有用: · Android Banking Trojan MoqHao Spreading via SMS Phishing in South Korea · XLoader Android Spyware and Banking Trojan...
-
下一篇
1.kotlin安卓实践课程-构建application
简介 主要会通过安卓实战来讲解kotlin语法和实际应用,本教程设及知识点包括框架模式mvp+mvvm, Databinding(数据绑定框架),Dagger2(依赖注入框架),DeepLink(页面路由框架),Rxjava,RxAndroid(异步操作框架),Retrofit,Okhtttp等,不过本教程重点在kotlin所以这些框架需要了解可自行百度。 针对人群:Android中级以上,kotlin入门 正式开始 都是程序员,直接看代码 /** * create by bigman * 知识点: 继承 ,init ,lateinit */ class App : Application() { //因为kotlin中的类定义同时也是构造函数,这个时候是不能进行操作的, // 所以kotlin增加了一个新的关键字init用来处理类的初始化问题,init模块中的内容可以直接使用构造函数的参数。 init { instance = this } //加入注解,标注这个apiComponent是需要注入的 //lateinit 则用于只能生命周期流程中进行获取或者初始化的变量,比如 And...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 面试大杂烩
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- 2048小游戏-低调大师作品
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL数据库中FOR UPDATE的使用
- Docker快速安装Oracle11G,搭建oracle11g学习环境

微信收款码
支付宝收款码