Android 自定义横向时间轴

news2024/11/13 8:53:44

示例:

一、添加依赖

dependencies {
    ***
    ***
    //添加RecyclerView的依赖包
    implementation 'androidx.recyclerview:recyclerview:1.2.1'
}

二、页面代码

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">



    <!--时间轴列表-->
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="wrap_content"
        android:layout_height="70dp" />

</LinearLayout>

list_point_cell.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:gravity="center"
    android:orientation="vertical">

   <TextView
       android:id="@+id/item_time"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_marginLeft="10dp"
       android:layout_marginRight="10dp"
       android:text="time"
       android:textSize="12sp" />

  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="30dp"
      android:orientation="horizontal">
      <ImageView
          android:id="@+id/item_start_img"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_weight="1"
          android:scaleType="fitXY"
          android:src="@mipmap/ic_line"/>

      <ImageView
          android:id="@+id/item_point_img"
          android:layout_width="15dp"
          android:layout_height="match_parent"
          android:src="@mipmap/ic_unselected_circle"/>

      <ImageView
          android:id="@+id/item_end_img"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_weight="1"
          android:scaleType="fitXY"
          android:src="@mipmap/ic_line"/>

  </LinearLayout>

    <TextView
        android:id="@+id/item_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:text="text"
        android:textSize="12sp" />
</LinearLayout>

三、java代码

MyRecyclerAdapter.java适配器

package com.example.horiztimeaxis;

import android.content.Context;
import android.content.SharedPreferences;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.HashMap;
import java.util.List;

import static android.content.Context.MODE_PRIVATE;

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder>  {

    private OnItemClickListener itemClickListener;// 接口对象
    private Context context;// 上下文
    private List<HashMap<String,String>> itemList;// 数据集合
    private int lastIndex = -1;

    public MyRecyclerAdapter(Context context,List<HashMap<String,String>> itemList){
        super();
        this.context = context;
        this.itemList = itemList;
        lastIndex = itemList.size()-1;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // TODO 自动生成的方法存根
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.list_point_cell,null);
        MyViewHolder holder = new MyViewHolder(view);
        return holder;

    }


    @Override
    public void onBindViewHolder(MyViewHolder holder,int position) {
        // 设置未选中状态
        holder.item_point_img.setImageDrawable(context.getDrawable(R.mipmap.ic_unselected_circle));
        holder.item_start_img.setVisibility(View.VISIBLE);
        holder.item_end_img.setVisibility(View.VISIBLE);
        // 隐藏第一个
        if (position==0){
            holder.item_start_img.setVisibility(View.INVISIBLE);
        }
        // 隐藏最后一个
        if (position == lastIndex){
            holder.item_end_img.setVisibility(View.INVISIBLE);
        }

        SharedPreferences time_sp = context.getSharedPreferences("TIME_LINE_SP",MODE_PRIVATE);
        int index = time_sp.getInt("INDEX_TIME",-1);
        if (index==position){
            // 设置选中状态
            holder.item_point_img.setImageDrawable(context.getDrawable(R.mipmap.ic_selected_circle));
        }

        HashMap<String, String> hashMap = itemList.get(position);
        // 赋值
        holder.time.setText(hashMap.get("TIME"));
        holder.tv.setText(hashMap.get("TEXT"));


    }

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


    protected class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView time;
        private ImageView item_start_img;
        private ImageView item_point_img;
        private ImageView item_end_img;
        private TextView tv;
        /**
         * @param itemView
         */
        public MyViewHolder(View itemView) {
            super(itemView);
            time = itemView.findViewById(R.id.item_time);
            item_start_img = itemView.findViewById(R.id.item_start_img);
            item_point_img = itemView.findViewById(R.id.item_point_img);
            item_end_img = itemView.findViewById(R.id.item_end_img);
            tv = itemView.findViewById(R.id.item_text);

            // 设置点击事件
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    itemClickListener.onItemClick(getAbsoluteAdapterPosition());
                }
            });
        }
    }


    /**
     * 点击接口方法(监听)
     * */
    public interface OnItemClickListener {
        void onItemClick(int position);
    }

    /**
     * 回调函数
     * */
    public void ItemClickCallBack(OnItemClickListener itemClickListener){
        this.itemClickListener = itemClickListener;
    }

}
MainActivity.java
package com.example.horiztimeaxis;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;

public class MainActivity extends AppCompatActivity {

    private RecyclerView rv;
    private MyRecyclerAdapter adapter;
    // 时间轴中数据
    private ArrayList<HashMap<String,String>> listItem;

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

        init();
    }

    /**
     * 使用方法
     * */
    private void init(){
        // 数据初始化
        initData();
        /** ---时间轴--- **/
        rv = findViewById(R.id.rv);

        //设置布局管理器
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        // 竖向布局
        //linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        // 横向布局
        linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        // 设置布局
        rv.setLayoutManager(linearLayoutManager);
        // 设置adpater
        adapter = new MyRecyclerAdapter(this,listItem);
        adapter.ItemClickCallBack(new MyRecyclerAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                SharedPreferences time_sp = getSharedPreferences("TIME_LINE_SP",MODE_PRIVATE);
                SharedPreferences.Editor editor = time_sp.edit();
                editor.putInt("INDEX_TIME",position);
                editor.commit();
                // 刷新
                adapter.notifyDataSetChanged();

                // 选中内容
                HashMap<String, String> map = listItem.get(position);
                Toast.makeText(getApplicationContext(),map.get("TIME")+map.get("TEXT"),Toast.LENGTH_SHORT).show();
            }
        });
        rv.setAdapter(adapter);

    }


    // 初始化显示的数据
    private void initData(){
        /*在数组中存放数据*/
        listItem = new ArrayList<HashMap<String, String>>();

        HashMap<String, String> map1 = new HashMap<String, String>(20);
        HashMap<String, String> map2 = new HashMap<String, String>(20);
        HashMap<String, String> map3 = new HashMap<String, String>(20);
        HashMap<String, String> map4 = new HashMap<String, String>(20);
        HashMap<String, String> map5 = new HashMap<String, String>(20);
        HashMap<String, String> map6 = new HashMap<String, String>(20);

        map1.put("TIME", "2023-8-3");
        map1.put("TEXT", "土地尚未开工");
        listItem.add(map1);

        map2.put("TIME", "2023-8-27");
        map2.put("TEXT", "夯实地基");
        listItem.add(map2);

        map3.put("TIME", "2023-9-4");
        map3.put("TEXT", "浇筑地梁");
        listItem.add(map3);

        map4.put("TIME", "2023-9-20");
        map4.put("TEXT", "主体砌筑");
        listItem.add(map4);

        map5.put("TIME", "2023-10-9");
        map5.put("TEXT", "封顶");
        listItem.add(map5);

        map6.put("TIME", "2023-11-10");
        map6.put("TEXT", "内部装修");
        listItem.add(map6);
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1080932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大语言模型迎来重大突破!找到解释神经网络行为方法

前不久&#xff0c;获得亚马逊40亿美元投资的ChatGPT主要竞争对手Anthropic在官网公布了一篇名为《朝向单义性&#xff1a;通过词典学习分解语言模型》的论文&#xff0c;公布了解释经网络行为的方法。 由于神经网络是基于海量数据训练而成&#xff0c;其开发的AI模型可以生成…

Virtual Box + Vagrant 快速搭建 Linux 虚拟开发环境

Virtual Box Vagrant 快速搭建 Linux 虚拟开发环境 1、根据自己所使用的操作系统平台&#xff0c;选择下载对应的虚拟机客户端软件 Virtual Box 并进行安装&#xff0c;这里选择的是 Virtual Box 7.0.10 Windows hosts 平台安装包。 选择安装目录为其他盘&#xff0c;避免默认…

【C++】STL总结:理解六大核心组件、各个组件主要功能

文章目录 六大核心组件的关联性1.容器2.迭代器3.算法4. 仿函数 / 函数对象5. 适配器 / 包装器6. 空间配置器 六大核心组件的关联性 1.容器 &#x1f517;&#x1f449;点击跳转 2.迭代器 &#x1f517;&#x1f449;点击跳转 3.算法 &#x1f517;&#x1f449;点击跳转 …

安科瑞消防设备电源监控系统在城市建筑中的应用

安科瑞 崔丽洁 摘要&#xff1a;2021年十四五规划里&#xff0c;也都有写到关于绿色循环经济的议题。在这样一个背景下&#xff0c;建筑行业也需要为实现“双碳”目标作出改变&#xff0c;建筑行业飞速发展&#xff0c;大量高层建筑拔地而起&#xff0c;在为了响应国家对于建筑…

生态共建 | 7-9月,YashanDB与13款产品完成兼容互认证

7-9月&#xff0c;深圳计算科学研究院崖山数据库系统YashanDB与柏科数据技术&#xff08;深圳&#xff09;股份有限公司、深圳钛铂数据有限公司、华润数字科技有限公司、武汉中地数码科技有限公司、龙芯中科技术股份有限公司、华瑞指数云科技&#xff08;深圳&#xff09;有限公…

LeetCode-199-二叉树的右视图

题目描述&#xff1a; 题目链接&#xff1a;LeetCode-199-二叉树的右视图 解题思路&#xff1a; 在 102 的基础之上进行改进&#xff0c;一维数组每次只保存 size1 时候的值 代码实现&#xff1a; class Solution {public List<Integer> rightSideView(TreeNode root) {i…

【算法-动态规划】斐波那契第 n 项

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

网络初识(JAVA EE)

文章目录 一、网络发展史二、网络通信基础三、协议分层四、封装和分用 一、网络发展史 独立模式&#xff1a;计算机之间相互独立&#xff0c;每个终端都各自持有客户数据&#xff0c;且当处理一个业务时&#xff0c;按照业务流程进行 网络互连&#xff1a;将多台计算机连接在一…

ELK集群 日志中心集群、kafka、logstash

ES&#xff1a;用来日志存储 Logstash:用来日志的搜集&#xff0c;进行日志格式转换并且传送给别人&#xff08;转发&#xff09; Kibana:主要用于日志的展示和分析 kafka Filebeat:搜集文件数据 es-1 本地解析 vi /etc/hosts scp /etc/hosts es-2:/etc/hosts scp /etc…

Maven Web应用

目录 创建 Web 应用 构建 Web 应用 部署 Web 应用 测试 Web 应用 本章节我们将学习如何使用版本控制系统 Maven 来管理一个基于 web 的项目&#xff0c;如何创建、构建、部署以及运行一个 web 应用。 创建 Web 应用 我们可以使用 maven-archetype-webapp 插件来创建一个简…

景区经营系统如何落地运营?景区系统重点功能推荐

在数字经济的引领下&#xff0c;文旅行业也迎来数字化转型的浪潮&#xff0c;需要借助数字化工具完成一整套景区经营管理落地方案。如蚓链数字化文旅系统拥有多端开发能力&#xff0c;可实现PC端、移动端、小程序等多端开发&#xff0c;让游客可随时随地畅游景区&#xff0c;提…

“互联网+”时代,3D全景营销打造千人千面营销点

现如今&#xff0c;元宇宙产业正在加速演化&#xff0c;传统的营销方式已经渐显疲态&#xff0c;3D全景营销的沉浸式体验为众多企业品牌打开新的营销领域。“互联网”时代&#xff0c;一些简单的图片、宣传单已经不能满足商家的宣传需求了&#xff0c;很难对客户产生吸引力&…

服务器编程基本框架

服务器编程基本框架 虽然服务器程序种类繁多&#xff0c;但其基本框架都一样&#xff0c;不同之处在于逻辑处理。 I/O 处理单元是服务器管理客户连接的模块。它通常要完成以下工作&#xff1a;等待并接受新的客户连接&#xff0c;接收客户数据&#xff0c;将服务器响应数据返回…

【广州华锐互动】钢厂铸锻部VR沉浸式实训系统

随着科技的不断进步&#xff0c;虚拟现实(VR)技术已成为当今最具潜力的技术之一。在钢铁行业中&#xff0c;VR虚拟仿真实训已经被广泛应用于培训和教育领域&#xff0c;特别是钢铁厂铸锻部&#xff0c;通过VR技术&#xff0c;可以大大提高培训效率&#xff0c;降低培训成本&…

alsa音频pcm设备之i2c调试

i2cdetect 列举 I2C bus i2cdetect -l ls /dev/i2c* 列出I2C bus i2c-7 上面连接的所有设备,并得到i2c设备地址 i2cdetect -y 7 发现i2c设备的位置显示为UU或表示设备地址的数值,UU表示设备在driver中被使用. I2cdump i2c设备大量register的值 i2cdump -y 7 0x40 I2cset设置…

AI游戏设计的半年度复盘;大模型+智能音箱再起波澜;昇思大模型技术公开课第2期;出海注册经验分享;如何使用LoRA微调Llama 2 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f525; 进步or毁灭&#xff1a;Nature 调研显示 1600 科学家对AI的割裂态度 国际顶级期刊 Nature 最近一项调研很有意思&#xff0c;全球 160…

从零学算法54

54.给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 螺旋遍历&#xff1a;从左上角开始&#xff0c;按照 向右、向下、向左、向上 的顺序 依次 提取元素&#xff0c;然后再进入内部一层重复相同的步骤&#xff0c;直到…

计算机竞赛python区块链实现 - proof of work工作量证明共识算法

文章目录 0 前言1 区块链基础1.1 比特币内部结构1.2 实现的区块链数据结构1.3 注意点1.4 区块链的核心-工作量证明算法1.4.1 拜占庭将军问题1.4.2 解决办法1.4.3 代码实现 2 快速实现一个区块链2.1 什么是区块链2.2 一个完整的快包含什么2.3 什么是挖矿2.4 工作量证明算法&…

计算机网络自顶向下实例

一名学生将便携机与学校的以太网交换机相连&#xff0c;下载一个Web页面 ①准备&#xff1a;DHCP、UDP、IP和以太网 学生启动便携机&#xff0c;然后用一根以太网电缆连接到学校的以太网交换机&#xff0c;交换机与学校的路由器相连。学校的路由器与一台ISP连接&#xff0c;以…

Java架构师高可用架构设计

目录 1 导学2 高可用到底是什么3 高可用架构的原则4 集群保障高可用5 限流保障高可用6 熔断降级保障高可用7 隔离保障高可用8 回滚保障高可用9 重试机制保障高可用10 备用系统11 辅助手段12 总结1 导学 在本章学习里面我们会先去学习耳熟能详的高可用到底是什么,然后呢去学习高…