【Android】时间轴


前言

提示:代码为Kotlin语言

在写记账本项目的时候,需要完成一个时间轴的效果,在此做下记录。


一、主要思路

主要的思路就是一个RecyclerView的应用,把RecyclerView的item分成左右两部分,左边用来显示收入的内容,右部用来显示支出的内容。
效果如下图:
在这里插入图片描述

二、代码展示

1.RecyclerView适配器

代码如下:

package com.example.timer_shaft_bill

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import de.hdodenhof.circleimageview.CircleImageView

class Account(val type:String, val price:String, val remark:String, val payType:Int)
class AccountAdapter(private val accountLists:ArrayList<Account>):RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    
    
    inner class IncomeViewHolder(view: View): RecyclerView.ViewHolder(view){
    
    
        val type:TextView = view.findViewById(R.id.income_type)
        val num:TextView = view.findViewById(R.id.income_num)
        val remark:TextView = view.findViewById(R.id.income_remark)
        val icon:CircleImageView = view.findViewById(R.id.type_icon)
    }
    inner class ExpendViewHolder(view: View) : RecyclerView.ViewHolder(view) {
    
    
        val type:TextView = view.findViewById(R.id.expend_type)
        val price:TextView = view.findViewById(R.id.expend_price)
        val remark:TextView = view.findViewById(R.id.expend_remark)
        val icon:CircleImageView = view.findViewById(R.id.type_icon)
    }

    override fun getItemViewType(position: Int): Int {
    
    
        val account = accountLists[position]
        return account.payType
    }
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    
    
        return if (viewType == 1){
    
    
            val view =
                LayoutInflater.from(parent.context).inflate(R.layout.account_item, parent, false)
            IncomeViewHolder(view)
        }else{
    
    
            val view =
                LayoutInflater.from(parent.context).inflate(R.layout.account_item, parent, false)
            ExpendViewHolder(view)
        }
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    
    
        val account = accountLists[position]
        when (holder) {
    
    
            is ExpendViewHolder -> {
    
    
                holder.type.text = account.type
                holder.price.text = account.price
                holder.remark.text = account.remark
                holder.icon.bringToFront()
            }
            is IncomeViewHolder -> {
    
    
                holder.type.text = account.type
                holder.num.text = account.price
                holder.remark.text = account.remark
                holder.icon.bringToFront()
            }
            else -> throw IllegalArgumentException()
        }
    }
    override fun getItemCount() = accountLists.size

    fun updateAccounts(lists:ArrayList<Account>){
    
    
        accountLists.clear()
        accountLists.addAll(lists)
        notifyDataSetChanged()
    }
}

2.MainActicity

代码如下:

package com.example.timer_shaft_bill

import android.graphics.Color
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import de.hdodenhof.circleimageview.CircleImageView

class MainActivity : AppCompatActivity() {
    
    
    override fun onCreate(savedInstanceState: Bundle?) {
    
    
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        window.statusBarColor = Color.TRANSPARENT // 设置状态栏颜色为透明
        initView()
    }
    private fun initView(){
    
    
        val accountLists = ArrayList<Account>()
        repeat(3){
    
    
            accountLists.add(Account("饮食","12","午饭",0))
            accountLists.add(Account("饮食","11","晚饭",0))
            accountLists.add(Account("兼职","50","家教",1))
        }

        // 获取layoutManager
        val layoutManager = LinearLayoutManager(this)
        val recyclerview = findViewById<RecyclerView>(R.id.recyclerview)
        recyclerview.layoutManager = layoutManager
        // 获取适配器
        val adapter = AccountAdapter(accountLists)
        recyclerview.adapter = adapter

        // 显示在最上层
        val addAccount = findViewById<CircleImageView>(R.id.add_account)
        addAccount.bringToFront()
    }
}

3.布局文件

1)account_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="80dp">

    <View
        android:layout_width="1dp"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:background="@color/purple_500" />

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/type_icon"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_centerInParent="true"
        android:src="@drawable/icon_demo"
        android:stateListAnimator="@null"/>

    <LinearLayout
        android:layout_width="120dp"
        android:layout_height="match_parent"
        android:layout_marginVertical="10dp"
        android:layout_alignParentEnd="true"
        android:layout_marginEnd="10dp"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="30dp">
            <TextView
                android:id="@+id/expend_type"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_vertical"
                android:textSize="16sp"
                android:textStyle="bold"
                android:textColor="@color/black"/>
            <TextView
                android:id="@+id/expend_price"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_vertical"
                android:textSize="16sp"
                android:textStyle="bold"
                android:textColor="@color/black"/>
        </LinearLayout>
        <TextView
            android:id="@+id/expend_remark"
            android:layout_width="match_parent"
            android:layout_height="20dp"
            android:gravity="center_vertical"
            android:textSize="14sp"
            android:textStyle="bold"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="120dp"
        android:layout_height="match_parent"
        android:layout_alignParentStart="true"
        android:layout_marginStart="40dp"
        android:layout_marginVertical="10dp"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="30dp">
            <TextView
                android:id="@+id/income_type"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_vertical"
                android:textSize="16sp"
                android:textStyle="bold"
                android:textColor="@color/black"/>
            <TextView
                android:id="@+id/income_num"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_vertical"
                android:textSize="16sp"
                android:textStyle="bold"
                android:textColor="@color/black"/>
        </LinearLayout>
        <TextView
            android:id="@+id/income_remark"
            android:layout_width="match_parent"
            android:layout_height="20dp"
            android:gravity="center_vertical"
            android:textSize="14sp"
            android:textStyle="bold"/>
    </LinearLayout>
</RelativeLayout>

2) activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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:id="@+id/drawerLayout"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <com.google.android.material.appbar.CollapsingToolbarLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"
            android:src="@drawable/bg"
            android:fitsSystemWindows="true"
            android:contentDescription="@null" />
    </com.google.android.material.appbar.CollapsingToolbarLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginHorizontal="30dp"
            android:orientation="horizontal">
            <TextView
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:text="@string/keep_account"
                android:textSize="20sp"
                android:textStyle="bold"
                android:textColor="@color/red"/>
            <TextView
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:text="@string/statement"
                android:textSize="20sp"
                android:textStyle="bold"/>
        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_marginTop="51dp"
            android:background="@color/blue"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginHorizontal="10dp"
            android:layout_marginTop="55dp"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/account_book"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:contentDescription="@null"
                android:src="@drawable/book" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="4"
                android:gravity="center"
                android:text="@string/add_budget" />

            <ImageView
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:contentDescription="@null"
                android:src="@drawable/calendar" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginTop="100dp"
            android:layout_marginHorizontal="30dp"
            android:orientation="horizontal">
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:orientation="vertical">
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="20dp"
                    android:gravity="center"
                    android:text="@string/income_demo"
                    android:textStyle="bold"
                    android:textSize="14sp"/>
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="20dp"
                    android:gravity="center"
                    android:text="@string/num_demo_1"
                    android:textSize="18sp"
                    android:textStyle="bold"
                    android:textColor="@color/black"/>
            </LinearLayout>

            <View
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:background="@color/blue"/>
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:orientation="vertical">
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="20dp"
                    android:gravity="center"
                    android:text="@string/expend_demo"
                    android:textStyle="bold"
                    android:textSize="14sp"/>
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="20dp"
                    android:gravity="center"
                    android:text="@string/num_demo_2"
                    android:textSize="18sp"
                    android:textStyle="bold"
                    android:textColor="@color/black"/>
            </LinearLayout>
        </LinearLayout>

        <de.hdodenhof.circleimageview.CircleImageView
            android:id="@+id/add_account"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="150dp"
            android:src="@drawable/pencil" />

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginHorizontal="20dp"
            android:layout_marginTop="200dp" />
    </RelativeLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

注意:CoordinatorLayoutCollapsingToolbarLayout是为了图片延伸到状态栏。


总结

总的来说,就是RecyclerView设置不同的View Holder:收入与支出,然后根据ViewHolder的类型放置到左边或右边。

猜你喜欢

转载自blog.csdn.net/m0_50115641/article/details/125890401