1. 程式人生 > >使用RecyclerView實現電商物流資訊的時光軸效果

使用RecyclerView實現電商物流資訊的時光軸效果

相信RecyclerView大家已經不陌生了,最近公司專案中檢視物流資訊需要用到時光軸,所以在完成此功能之後寫下了這一篇文章,希望對大家有所幫助.

  • 需求
  • 要達到的效果
  • 實現功能

需求

首先為什麼要做時光軸,用它來體現有什麼好處,現在比較大的電商平臺如天貓,京東,物流資訊都是使用時光軸,能讓使用者清晰的看到自己所購買的商品的最新動態,和經過了哪些地方。

要達到的效果:

如下的效果圖
時光軸的效果圖:

實現功能

程式碼塊

先準備好資料設定到RecyclerView


private void initData() {
        mDatas = new ArrayList<DateText>();
        mDatas.add(new DateText("20140710"
, "【上海市】快件已到達上海")); mDatas.add(new DateText("20120209", "【上海市】快件已到達上海浦東新區")); mDatas.add(new DateText("20140526", "【上海市】快件已到達上海浦東新區軟體園")); mDatas.add(new DateText("20140623", "【上海市】因放假原因,快件等工作日發出")); mDatas.add(new DateText("20140121", "【上海市】快件已到達上海浦東軟體園已發出")); mDatas.add(new DateText("20140916"
, "【上海市】快件已到達上海浦東軟體園已簽收")); mDatas.add(new DateText("20140712", "【上海市】快件已到達上海浦東軟體園已發出")); mDatas.add(new DateText("20140710", "【上海市】快件已到達上海浦東已收入")); initView(); } private void initView() { recyclerView = (RecyclerView) findViewById(R.id.timeline_recyclerview); init(); } private void init() { // 將資料按照時間排序 DateComparator comparator = new DateComparator(); Collections.sort(mDatas, comparator); mTimeLineAdapter = new TimeLineAdapter(this, mDatas); LayoutManager mLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true); recyclerView.setAdapter(mTimeLineAdapter); recyclerView.setLayoutManager(mLayoutManager); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setHasFixedSize(true); }

介面卡需要做的工作

@Override
    public void onBindViewHolder(TimeLineViewHolder holder, int position) {
        //當資料為最後一個時,說明沒有要顯示的資料了,將線隱藏掉
        if (position == (getItemCount() - 1)) {
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT);
            layoutParams.setMargins(0, 10, 0, 0);
            holder.iv_point.setLayoutParams(layoutParams);
            holder.iv_point.setSelected(true);
            //將下標為最後一個的上方的線頭隱藏掉
            holder.line.setVisibility(View.INVISIBLE);
        } else {
            holder.line.setVisibility(View.VISIBLE);
            holder.iv_point.setSelected(false);
        }
        holder.date_time.setText(TimeFormat.format("yyyy.MM.dd", mDatas.get(position).getDate()));
        holder.date_content.setText(mDatas.get(position).getText());
    }

佈局檔案

<?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" >

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0.8"
        android:gravity="center_horizontal"
        android:orientation="vertical" >

        <View
            android:id="@+id/v_line"
            android:layout_width="0.5dp"
            android:layout_height="0dp"
            android:layout_weight="0.6"
            android:background="#7F7C7C" />

        <ImageView
            android:id="@+id/iv_point"
            android:layout_width="10dp"
            android:layout_height="10dp"
            android:background="@drawable/point_selector" />

        <View
            android:layout_width="0.5dp"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="#7F7C7C" />
    </LinearLayout>

    <RelativeLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_gravity="center_vertical"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="5dp"
        android:layout_marginLeft="8dp"
        android:layout_weight="9" >

        <TextView
            android:id="@+id/txt_date_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:maxLines="2"
            android:text="sad"
            android:textColor="#5296C5"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/txt_date_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/txt_date_content"
            android:layout_below="@+id/txt_date_content"
            android:text="asdssfgdg"
            android:textColor="#FC6802"
            android:textSize="12sp" />
    </RelativeLayout>

</LinearLayout>

指示點用選擇器達到最新的資訊高亮
詳情見原始碼