1. 程式人生 > >實現一個簡單的類似 TabLayout 的頂部指示器

實現一個簡單的類似 TabLayout 的頂部指示器

在實際的專案開發中, 我們經常會用到類似 TabLayout 的佈局, 但是有的時候我們的需求樣式可能會跟 TabLayout 的樣式不太一樣, 今天帶給大家一個簡單的自定義指示器.

先來看下專案演示效果:
這裡寫圖片描述

這裡寫圖片描述

專案需求:
1. 頂部的 item 有可能是文字, 也有可能是圖片;
2. item 數量較少時, 可全屏顯示, item 過多時, 需要支援橫向滑動;
3. 指示器的樣式問題, 不同的位置可能樣式不一樣, 這裡需要考慮指示器樣式擴充套件性問題;
4. 新增資料時, 我希望是類似 ListView 那樣, 通過介面卡新增資料,而不是一個一個 add 進去.

專案整體簡介:
1.自定義屬性:
1).default_count:
該屬性是用來定義一屏顯示的預設的總的 item 個數, 如果 item 個數小於等於這個預設的值, 就平均分配大小

2.頂部 item 的處理:
專案中通過介面卡模式為佈局新增 itemView, 這裡使用的是原生的介面卡 BaseAdapter, 使用的時候我們可以像寫 ListView 介面卡那樣,
寫一個介面卡類繼承自 BaseAdapter

3.指示器樣式:
專案中指示器樣式的實現被分離出來, 這裡實際上用了一個策略模式, 預設已經給出了兩個樣式, 如果給定的樣式不滿足專案的要求, 可以自己實現
IndicatorStrategy介面, 根據需求實現自己的邏輯

目前給出兩個預設的樣式, 後續會持續新增其他的樣式, 邏輯很簡單

使用方法:
1.在佈局中引入

<com.example
.tabtitlelayout.weight.TabTitleLayout android:id="@+id/tabTitleLayout" android:layout_width="match_parent" app:default_count="5" android:layout_height="48dp"/> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_below="@id/tabTitleLayout"/>

2.定義一個頂部 tab 的介面卡繼承自 BaseAdapter

3.定義 Fragment 介面卡

4.Activity 重配置

mViewPager.setAdapter(mPageAdapter);
        mTitleLayout.setAdapter(mAdapter);
        mTitleLayout.setUpWithViewPager(mViewPager);
        mTitleLayout.setIndicatorStrategy(mLineIndicator);
        mTitleLayout.setOnIndicatorClickListener(this);

        titleList = new ArrayList<>();
        titleList.add("第一");
        titleList.add("第二");
        titleList.add("第三");
        titleList.add("第四");
        titleList.add("第五");
        titleList.add("第六");
        titleList.add("第七");
        titleList.add("第八");
        mAdapter.setTitleList(titleList);
        for (int i = 0; i < titleList.size(); i++) {
            CommonFragment commonFragment = CommonFragment.newInstance(i);
            mFragmentList.add(commonFragment);
        }
        mPageAdapter.setFragmentList(mFragmentList);

android 開發交流群: 190088567

相關推薦

實現一個簡單類似 TabLayout頂部指示器

在實際的專案開發中, 我們經常會用到類似 TabLayout 的佈局, 但是有的時候我們的需求樣式可能會跟 TabLayout 的樣式不太一樣, 今天帶給大家一個簡單的自定義指示器. 先來看下專案演示效果: 專案需求: 1. 頂部的 item 有可

實現一個簡單的lazyman

實現 blog cti name init timeout bin bsp stack function lazyman(name) { return new lazyman.fn.init(name); } lazyman.fn = lazyman.proto

用java實現一個簡單的單用戶登陸功能的思路

get 單用戶 這樣的 簡單的 lock ref 數據庫 清除 一個 引用 所謂“單用戶單賬戶登錄”是指:在同一系統中,一個用戶名不能在兩個地方同時登錄。 我們參照 QQ 實現效果:當某賬號在 A 處登錄後,在未退出的情況下,如果再到 B 處登錄,那麽,系統會擠下 A 處

【Java】Swing+IO流實現一個簡單的文件加密程序

als oncommand override fault 源文件 abs directory imp select EncrytService package com.my.service; import java.io.File; import java

【Java】Swing+IO流實現一個簡單的文件加密程序(較完整版)

move 初始 baidu images 文件選擇器 while login 一個 ktr 留著參考 beans package com.my.bean; import java.io.Serializable; public class

Linux中實現一個簡單的進度條【轉】

做的 會有 發現 文件 rsquo 實時 時間 改進 常見 轉自:http://blog.csdn.net/yuehailin/article/details/53999288 說起進度條,其實大家常常見到,比如說你在下載視頻或文件的時候,提示你當前下載進度的就是我們今天

用 C# 實現一個簡單的 Rest Service 供外部調用

message [] operation rem adk www span method title 用 C# 實現一個簡單的 Restful Service 供外部調用,大體總結為4點: The service contract (the methods it o

jQuery實現一個簡單的購物車功能

名稱 展示 -1 set margin for button ans return 最近由於工作需要的原因,開始系統學習jQuery的知識,然後跟著一個視頻教程做了一個購物車的功能,現總結如下。 第一步:準備HTML頁面,代碼如下: <!DOCTYPE html P

實現一個簡單的ConnectionPool

方法 == span sql 需要 動手 cti 修改 使用 看了一圈, 沒看到稍微好用的ConnectionPool, 除了一個aiomysql, 但是這個是異步的, 我暫時沒有用到這麽高版本的Python, 所以就動手造一個輪子. 原理比較簡單, 先造一個線程安全的集

實現一個簡單的虛擬demo算法

child mov 箭頭 內存 架構模式 ren 操作 inpu 設置 假如現在你需要寫一個像下面一樣的表格的應用程序,這個表格可以根據不同的字段進行升序或者降序的展示。 這個應用程序看起來很簡單,你可以想出好幾種不同的方式來寫。最容易想到的可能是,在你的 JavaScr

自己動手實現一個簡單的JSON解析器

pair bool 優點 輕量 結束 pan isdigit 復雜 false 1. 背景 JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。相對於另一種數據交換格式 XML,JSON 有著諸多優點。比如易讀性更好,占用空間更少等

Socket實現一個簡單的半雙工通信

沒有 sta exception 分析 對講 想去 info 信息 keyword Socket是client進行在網絡與server進行數據交互的一種基本通信方式。

模板方法模式 + 觀察者模式 + 簡單工廠模式 + 單例模式實現一個簡單的數據表讀寫

private 數據庫鏈 obs imp 通知 model 數據表 ring pri 實現功能: 對數據表的讀要緩存起來,對數據表的寫需要清除緩存. 數據表根據屬性字段來決定是否緩存 可以更換數據庫鏈接方式,比如可以隨時更換為mysql或mysqli() 當插入數據時給出一

阿裏微服務專家手寫Spring Boot 實現一個簡單的自動配置模塊

微服務 簡單的 AR AI tps ble 免費 VM 知識體系 為了更好的理解 Spring Boot 的 自動配置和工作原理,我們自己來實現一個簡單的自動配置模塊。 假設,現在項目需要一個功能,需要自動記錄項目發布者的相關信息,我們如何通過 Spring Boot 的

Java實現一個簡單的事件監聽器

tro 模型 when rgs sdf span 傳遞 inter pre 關於事件監聽我們需要知道的一些基礎知識。 a)事件三要素: source -- 事件源 when -- 事件發生時間 message -- 事件主題消息

使用ASP.NET SignalR實現一個簡單的聊天室

spl 記錄 歷史 undefine reat 語句 關鍵字 pda name  前言   距離我寫上一篇博客已經又過了一年半載了,時間過得很快,一眨眼,就把人變得滄桑了許多。青春是短暫的,知識是無限的。要用短暫的青春,去學無窮無盡的知識,及時當勉勵,歲月不待人。今天寫個隨

C++11實現一個簡單的線程池

start art AI fun con var func iostream any 為了不讓手生,邊復習邊手擼了一個線程池,代碼量比較少,如下,用了一些C++11的實現,語言標準嘛,就是跨平臺的: thread_poo.h #ifndef _THREAD_POOL_ #

自己寫一個C#數據結構:用List<T>實現一個簡單的Stack

count 實現簡單 ole exceptio tac on() rem linq -- 在C#中利用List<T>實現一個簡單的Stack 需要實現的功能:壓棧、彈棧、查看棧頂元素、查看元素個數、查看Socket是否為空,判斷元素是否在Socket中、清空So

2.實現一個簡單的任務

time rtu value his long script 窗口 color actually 創建實體 把實體類寫在Core項目中,因為實體是領域層的一部分。 一個簡單的應用場景:創建一些任務(Assignment)並分配給人。 我們需要Assignment和Perso

使用隊列queue實現一個簡單的生產者消費者模型

star 線程 import form += art start 慢慢 隊列 一、生產者消費者模型 我們去超市商店等地購買商品時,我們大部分人都會說自己是消費者,而超市的各大供貨商、工廠等,自然而然地也就成了我們的生產者。如此一來,生產者有了,消費者也有了,那麽將二者聯系起