Ecoer Logo
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS36.40%
Net Worth
3.533USD
STEEM
0.001STEEM
SBD
6.078SBD
Own SP
10.620SP

Detailed Balance

STEEM
balance
0.001STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
10.620SP
Delegated Out
0.000SP
Delegation In
0.000SP
Effective Power
10.620SP
Reward SP (pending)
0.000SP
SBD
sbd_balance
6.078SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.000SBD
{
  "balance": "0.001 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "0.000 STEEM",
  "vesting_shares": "17273.827243 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "0.000000 VESTS",
  "sbd_balance": "6.078 SBD",
  "savings_sbd_balance": "0.000 SBD",
  "reward_sbd_balance": "0.000 SBD",
  "conversions": []
}

Account Info

namesteven.tjg
id543019
rank127,352
reputation236470476775
created2017-12-31T06:07:39
recovery_accountsteem
proxyNone
post_count23
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-02-19T04:12:45
last_root_post2018-02-19T04:12:45
last_vote_time2018-02-20T02:46:54
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.001 STEEM
savings_balance0.000 STEEM
sbd_balance6.078 SBD
savings_sbd_balance0.000 SBD
vesting_shares17273.827243 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares0.000000 VESTS
reward_vesting_balance0.000000 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update2018-01-05T09:18:54
minedNo
sbd_seconds0
sbd_last_interest_payment2018-02-20T00:09:42
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "active": {
    "account_auths": [],
    "key_auths": [
      [
        "STM68gq4qwGoFRu9cv9fmpxDikKD9pixNcTT32jWiWpoVPkVzkMFj",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "balance": "0.001 STEEM",
  "can_vote": true,
  "comment_count": 0,
  "created": "2017-12-31T06:07:39",
  "curation_rewards": 192,
  "delegated_vesting_shares": "0.000000 VESTS",
  "downvote_manabar": {
    "current_mana": "4318456810",
    "last_update_time": 1588954137
  },
  "guest_bloggers": [],
  "id": 543019,
  "json_metadata": "{\"profile\":{\"name\":\"Steven\",\"location\":\"Indonesia\",\"profile_image\":\"https://s26.postimg.org/5u0cys9s9/20150910_144612.jpg\"}}",
  "last_account_recovery": "1970-01-01T00:00:00",
  "last_account_update": "2018-01-05T09:18:54",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_post": "2018-02-19T04:12:45",
  "last_root_post": "2018-02-19T04:12:45",
  "last_vote_time": "2018-02-20T02:46:54",
  "lifetime_vote_count": 0,
  "market_history": [],
  "memo_key": "STM6yiWpqPcKUeo3ospn48DstZSJNGcHPyPZYyENWeyYDKnkeMeRZ",
  "mined": false,
  "name": "steven.tjg",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "other_history": [],
  "owner": {
    "account_auths": [],
    "key_auths": [
      [
        "STM5YecQd5WyTDm9i91wUKo5uYGo6NBEt4Xjm69spjspDZsaSfK78",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "pending_claimed_accounts": 0,
  "post_bandwidth": 0,
  "post_count": 23,
  "post_history": [],
  "posting": {
    "account_auths": [
      [
        "utopian.app",
        1
      ]
    ],
    "key_auths": [
      [
        "STM8JeGoZdBiDEyZ72Ayn8RewMY4t4Kxvwv3ZYECyECuRCZhNydFr",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "posting_json_metadata": "{\"profile\":{\"name\":\"Steven\",\"location\":\"Indonesia\",\"profile_image\":\"https://s26.postimg.org/5u0cys9s9/20150910_144612.jpg\"}}",
  "posting_rewards": 15502,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "proxy": "",
  "received_vesting_shares": "0.000000 VESTS",
  "recovery_account": "steem",
  "reputation": "236470476775",
  "reset_account": "null",
  "reward_sbd_balance": "0.000 SBD",
  "reward_steem_balance": "0.000 STEEM",
  "reward_vesting_balance": "0.000000 VESTS",
  "reward_vesting_steem": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "sbd_balance": "6.078 SBD",
  "sbd_last_interest_payment": "2018-02-20T00:09:42",
  "sbd_seconds": "0",
  "sbd_seconds_last_update": "2018-02-26T07:13:18",
  "tags_usage": [],
  "to_withdraw": 0,
  "transfer_history": [],
  "vesting_balance": "0.000 STEEM",
  "vesting_shares": "17273.827243 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "vote_history": [],
  "voting_manabar": {
    "current_mana": "17273827243",
    "last_update_time": 1588954137
  },
  "voting_power": 0,
  "withdraw_routes": 0,
  "withdrawn": 0,
  "witness_votes": [],
  "witnesses_voted_for": 0,
  "rank": 127352
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 0.000 SP to @steven.tjg
2020/05/08 16:08:57
delegateesteven.tjg
delegatorsteem
vesting shares0.000000 VESTS
Transaction InfoBlock #43201113/Trx df8458003c0de4a6cb4643995e711d5f3ad87db3
View Raw JSON Data
{
  "block": 43201113,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "steven.tjg",
      "delegator": "steem",
      "vesting_shares": "0.000000 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-05-08T16:08:57",
  "trx_id": "df8458003c0de4a6cb4643995e711d5f3ad87db3",
  "trx_in_block": 24,
  "virtual_op": 0
}
2019/12/31 06:36:36
authorsteemitboard
bodyCongratulations @steven.tjg! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@steven.tjg/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@steven.tjg) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=steven.tjg)_</sub> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
parent authorsteven.tjg
parent permlinkhow-to-implement-shimmer-load-in-android
permlinksteemitboard-notify-steventjg-20191231t063636000z
title
Transaction InfoBlock #39511488/Trx 4a20ec36bc6dc09e5842b27d6fb4f63590dfa143
View Raw JSON Data
{
  "block": 39511488,
  "op": [
    "comment",
    {
      "author": "steemitboard",
      "body": "Congratulations @steven.tjg! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@steven.tjg/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@steven.tjg) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=steven.tjg)_</sub>\n\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
      "parent_author": "steven.tjg",
      "parent_permlink": "how-to-implement-shimmer-load-in-android",
      "permlink": "steemitboard-notify-steventjg-20191231t063636000z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-12-31T06:36:36",
  "trx_id": "4a20ec36bc6dc09e5842b27d6fb4f63590dfa143",
  "trx_in_block": 11,
  "virtual_op": 0
}
dtubesent 0.001 STEEM to @steven.tjg- "Time is running out, claim your DTube account now before anyone else can! Login at https://d.tube"
2019/08/22 16:05:36
amount0.001 STEEM
fromdtube
memoTime is running out, claim your DTube account now before anyone else can! Login at https://d.tube
tosteven.tjg
Transaction InfoBlock #35779321/Trx ccb39bde4542954e7f023d807791f3ce46ac589f
View Raw JSON Data
{
  "block": 35779321,
  "op": [
    "transfer",
    {
      "amount": "0.001 STEEM",
      "from": "dtube",
      "memo": "Time is running out, claim your DTube account now before anyone else can! Login at https://d.tube",
      "to": "steven.tjg"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-08-22T16:05:36",
  "trx_id": "ccb39bde4542954e7f023d807791f3ce46ac589f",
  "trx_in_block": 10,
  "virtual_op": 0
}
2018/12/31 08:04:00
authorsteemitboard
bodyCongratulations @steven.tjg! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@steven.tjg/birthday1.png</td><td>1 Year on Steemit</td></tr></table> <sub>_[Click here to view your Board](https://steemitboard.com/@steven.tjg)_</sub> **Do not miss the last post from @steemitboard:** <table><tr><td><a href="https://steemit.com/christmas/@steemitboard/christmas-challenge-send-a-gift-to-to-your-friends-the-party-continues"><img src="https://steemitimages.com/64x128/http://i.cubeupload.com/kf4SJb.png"></a></td><td><a href="https://steemit.com/christmas/@steemitboard/christmas-challenge-send-a-gift-to-to-your-friends-the-party-continues">Christmas Challenge - The party continues</a></td></tr></table> > Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
parent authorsteven.tjg
parent permlinkhow-to-implement-shimmer-load-in-android
permlinksteemitboard-notify-steventjg-20181231t080359000z
title
Transaction InfoBlock #29040087/Trx a944f105ac1ee6fdc3e81da27aa06443e71e3f2d
View Raw JSON Data
{
  "block": 29040087,
  "op": [
    "comment",
    {
      "author": "steemitboard",
      "body": "Congratulations @steven.tjg! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@steven.tjg/birthday1.png</td><td>1 Year on Steemit</td></tr></table>\n\n<sub>_[Click here to view your Board](https://steemitboard.com/@steven.tjg)_</sub>\n\n\n**Do not miss the last post from @steemitboard:**\n<table><tr><td><a href=\"https://steemit.com/christmas/@steemitboard/christmas-challenge-send-a-gift-to-to-your-friends-the-party-continues\"><img src=\"https://steemitimages.com/64x128/http://i.cubeupload.com/kf4SJb.png\"></a></td><td><a href=\"https://steemit.com/christmas/@steemitboard/christmas-challenge-send-a-gift-to-to-your-friends-the-party-continues\">Christmas Challenge - The party continues</a></td></tr></table>\n\n> Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
      "parent_author": "steven.tjg",
      "parent_permlink": "how-to-implement-shimmer-load-in-android",
      "permlink": "steemitboard-notify-steventjg-20181231t080359000z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-12-31T08:04:00",
  "trx_id": "a944f105ac1ee6fdc3e81da27aa06443e71e3f2d",
  "trx_in_block": 7,
  "virtual_op": 0
}
steemdelegated 1.250 SP to @steven.tjg
2018/05/28 08:59:21
delegateesteven.tjg
delegatorsteem
vesting shares2033.619776 VESTS
Transaction InfoBlock #22821460/Trx 8092d195e52a8705ee509ed13a1aac4cdb3b4408
View Raw JSON Data
{
  "block": 22821460,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "steven.tjg",
      "delegator": "steem",
      "vesting_shares": "2033.619776 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-28T08:59:21",
  "trx_id": "8092d195e52a8705ee509ed13a1aac4cdb3b4408",
  "trx_in_block": 25,
  "virtual_op": 0
}
2018/03/04 20:07:54
authorsteven.tjg
permlinkrugcmill
voterdeusdecomboser
weight10000 (100.00%)
Transaction InfoBlock #20389535/Trx 149f20e7c9ee6b38c606c980778973f04255355c
View Raw JSON Data
{
  "block": 20389535,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "rugcmill",
      "voter": "deusdecomboser",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-03-04T20:07:54",
  "trx_id": "149f20e7c9ee6b38c606c980778973f04255355c",
  "trx_in_block": 2,
  "virtual_op": 0
}
2018/03/04 20:07:48
authorsteven.tjg
permlinkrugcmill
voterdeusdecomboser
weight10000 (100.00%)
Transaction InfoBlock #20389533/Trx 76a4cc3a879fd894e85c960f3eb880c82e25bf45
View Raw JSON Data
{
  "block": 20389533,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "rugcmill",
      "voter": "deusdecomboser",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-03-04T20:07:48",
  "trx_id": "76a4cc3a879fd894e85c960f3eb880c82e25bf45",
  "trx_in_block": 44,
  "virtual_op": 0
}
steemdelegated 8.224 SP to @steven.tjg
2018/02/26 08:24:12
delegateesteven.tjg
delegatorsteem
vesting shares13376.086340 VESTS
Transaction InfoBlock #20202886/Trx d455b369d43418651beb2157f563899a169b5fde
View Raw JSON Data
{
  "block": 20202886,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "steven.tjg",
      "delegator": "steem",
      "vesting_shares": "13376.086340 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-26T08:24:12",
  "trx_id": "d455b369d43418651beb2157f563899a169b5fde",
  "trx_in_block": 23,
  "virtual_op": 0
}
steven.tjgclaimed reward balance: 6.078 SBD, 2.309 SP
2018/02/26 07:13:18
accountsteven.tjg
reward sbd6.078 SBD
reward steem0.000 STEEM
reward vests3755.688095 VESTS
Transaction InfoBlock #20201468/Trx 131fb25381f88be62325a013c1894dedf5f84a36
View Raw JSON Data
{
  "block": 20201468,
  "op": [
    "claim_reward_balance",
    {
      "account": "steven.tjg",
      "reward_sbd": "6.078 SBD",
      "reward_steem": "0.000 STEEM",
      "reward_vests": "3755.688095 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-26T07:13:18",
  "trx_id": "131fb25381f88be62325a013c1894dedf5f84a36",
  "trx_in_block": 65,
  "virtual_op": 0
}
steven.tjgreceived 6.078 SBD, 2.309 SP author reward for @steven.tjg / how-to-implement-shimmer-load-in-android
2018/02/26 04:12:45
authorsteven.tjg
permlinkhow-to-implement-shimmer-load-in-android
sbd payout6.078 SBD
steem payout0.000 STEEM
vesting payout3755.688095 VESTS
Transaction InfoBlock #20197856/Virtual Operation #15
View Raw JSON Data
{
  "block": 20197856,
  "op": [
    "author_reward",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-shimmer-load-in-android",
      "sbd_payout": "6.078 SBD",
      "steem_payout": "0.000 STEEM",
      "vesting_payout": "3755.688095 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-26T04:12:45",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 15
}
utopian.payreceived 1.539 SP benefactor reward from @steven.tjg
2018/02/26 04:12:45
authorsteven.tjg
benefactorutopian.pay
permlinkhow-to-implement-shimmer-load-in-android
sbd payout0.000 SBD
steem payout0.000 STEEM
vesting payout2503.110945 VESTS
Transaction InfoBlock #20197856/Virtual Operation #14
View Raw JSON Data
{
  "block": 20197856,
  "op": [
    "comment_benefactor_reward",
    {
      "author": "steven.tjg",
      "benefactor": "utopian.pay",
      "permlink": "how-to-implement-shimmer-load-in-android",
      "sbd_payout": "0.000 SBD",
      "steem_payout": "0.000 STEEM",
      "vesting_payout": "2503.110945 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-26T04:12:45",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 14
}
steven.tjgclaimed reward balance: 0.003 SP
2018/02/26 03:27:27
accountsteven.tjg
reward sbd0.000 SBD
reward steem0.000 STEEM
reward vests4.087190 VESTS
Transaction InfoBlock #20196951/Trx 6d8cc47e17f1313233f33feb0b548a3ac700ace7
View Raw JSON Data
{
  "block": 20196951,
  "op": [
    "claim_reward_balance",
    {
      "account": "steven.tjg",
      "reward_sbd": "0.000 SBD",
      "reward_steem": "0.000 STEEM",
      "reward_vests": "4.087190 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-26T03:27:27",
  "trx_id": "6d8cc47e17f1313233f33feb0b548a3ac700ace7",
  "trx_in_block": 7,
  "virtual_op": 0
}
steven.tjgreceived 0.001 SP curation reward for @alfarisi94 / how-to-use-database-eloquent-in-slim
2018/02/24 11:32:09
comment authoralfarisi94
comment permlinkhow-to-use-database-eloquent-in-slim
curatorsteven.tjg
reward2.043538 VESTS
Transaction InfoBlock #20149062/Virtual Operation #25
View Raw JSON Data
{
  "block": 20149062,
  "op": [
    "curation_reward",
    {
      "comment_author": "alfarisi94",
      "comment_permlink": "how-to-use-database-eloquent-in-slim",
      "curator": "steven.tjg",
      "reward": "2.043538 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-24T11:32:09",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 25
}
steven.tjgreceived 0.001 SP curation reward for @alfarisi94 / how-to-use-twig-templating-in-slim
2018/02/23 10:21:18
comment authoralfarisi94
comment permlinkhow-to-use-twig-templating-in-slim
curatorsteven.tjg
reward2.043652 VESTS
Transaction InfoBlock #20118849/Virtual Operation #114
View Raw JSON Data
{
  "block": 20118849,
  "op": [
    "curation_reward",
    {
      "comment_author": "alfarisi94",
      "comment_permlink": "how-to-use-twig-templating-in-slim",
      "curator": "steven.tjg",
      "reward": "2.043652 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-23T10:21:18",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 114
}
2018/02/20 20:18:24
authorutopian-io
body### Hey @steven.tjg I am @utopian-io. I have just upvoted you! #### Achievements - You have less than 500 followers. Just gave you a gift to help you succeed! - Seems like you contribute quite often. AMAZING! #### Suggestions - Contribute more often to get higher and higher rewards. I wish to see you often! - Work on your followers to increase the votes/rewards. I follow what humans do and my vote is mainly based on that. Good luck! #### Get Noticed! - Did you know project owners can manually vote with their own voting power or by voting power delegated to their projects? Ask the project owner to review your contributions! #### Community-Driven Witness! I am the first and only Steem Community-Driven Witness. <a href="https://discord.gg/zTrEMqB">Participate on Discord</a>. Lets GROW TOGETHER! - <a href="https://v2.steemconnect.com/sign/account-witness-vote?witness=utopian-io&approve=1">Vote for my Witness With SteemConnect</a> - <a href="https://v2.steemconnect.com/sign/account-witness-proxy?proxy=utopian-io&approve=1">Proxy vote to Utopian Witness with SteemConnect</a> - Or vote/proxy on <a href="https://steemit.com/~witnesses">Steemit Witnesses</a> [![mooncryption-utopian-witness-gif](https://steemitimages.com/DQmYPUuQRptAqNBCQRwQjKWAqWU3zJkL3RXVUtEKVury8up/mooncryption-s-utopian-io-witness-gif.gif)](https://steemit.com/~witnesses) **Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x**
json metadata{"tags":["utopian-io"],"community":"utopian","app":"utopian/1.0.0"}
parent authorsteven.tjg
parent permlinkhow-to-implement-shimmer-load-in-android
permlinkre-steventjg-how-to-implement-shimmer-load-in-android-20180220t201824458z
title
Transaction InfoBlock #20044405/Trx 71ff728647a9d16cd67f6c6d6341f2d676dae5ec
View Raw JSON Data
{
  "block": 20044405,
  "op": [
    "comment",
    {
      "author": "utopian-io",
      "body": "### Hey @steven.tjg I am @utopian-io. I have just upvoted you!\n#### Achievements\n- You have less than 500 followers. Just gave you a gift to help you succeed!\n- Seems like you contribute quite often. AMAZING!\n#### Suggestions\n- Contribute more often to get higher and higher rewards. I wish to see you often!\n- Work on your followers to increase the votes/rewards. I follow what humans do and my vote is mainly based on that. Good luck!\n#### Get Noticed!\n- Did you know project owners can manually vote with their own voting power or by voting power delegated to their projects? Ask the project owner to review your contributions!\n#### Community-Driven Witness!\nI am the first and only Steem Community-Driven Witness. <a href=\"https://discord.gg/zTrEMqB\">Participate on Discord</a>. Lets GROW TOGETHER!\n- <a href=\"https://v2.steemconnect.com/sign/account-witness-vote?witness=utopian-io&approve=1\">Vote for my Witness With SteemConnect</a>\n- <a href=\"https://v2.steemconnect.com/sign/account-witness-proxy?proxy=utopian-io&approve=1\">Proxy vote to Utopian Witness with SteemConnect</a>\n- Or vote/proxy on <a href=\"https://steemit.com/~witnesses\">Steemit Witnesses</a>\n\n[![mooncryption-utopian-witness-gif](https://steemitimages.com/DQmYPUuQRptAqNBCQRwQjKWAqWU3zJkL3RXVUtEKVury8up/mooncryption-s-utopian-io-witness-gif.gif)](https://steemit.com/~witnesses)\n\n**Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x**",
      "json_metadata": "{\"tags\":[\"utopian-io\"],\"community\":\"utopian\",\"app\":\"utopian/1.0.0\"}",
      "parent_author": "steven.tjg",
      "parent_permlink": "how-to-implement-shimmer-load-in-android",
      "permlink": "re-steventjg-how-to-implement-shimmer-load-in-android-20180220t201824458z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-20T20:18:24",
  "trx_id": "71ff728647a9d16cd67f6c6d6341f2d676dae5ec",
  "trx_in_block": 20,
  "virtual_op": 0
}
2018/02/20 20:18:21
authorsteven.tjg
permlinkhow-to-implement-shimmer-load-in-android
voterutopian-io
weight257 (2.57%)
Transaction InfoBlock #20044404/Trx a1d661086d7e9f4122baf6e6a288a8930a880b02
View Raw JSON Data
{
  "block": 20044404,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-shimmer-load-in-android",
      "voter": "utopian-io",
      "weight": 257
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-20T20:18:21",
  "trx_id": "a1d661086d7e9f4122baf6e6a288a8930a880b02",
  "trx_in_block": 30,
  "virtual_op": 0
}
2018/02/20 08:37:00
authorsteven.tjg
permlinkhow-to-implement-shimmer-load-in-android
voterkennethz
weight10000 (100.00%)
Transaction InfoBlock #20030378/Trx 1baf704bf7aa7647c82b100a8faa9d5170a7bc6c
View Raw JSON Data
{
  "block": 20030378,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-shimmer-load-in-android",
      "voter": "kennethz",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-20T08:37:00",
  "trx_id": "1baf704bf7aa7647c82b100a8faa9d5170a7bc6c",
  "trx_in_block": 10,
  "virtual_op": 0
}
2018/02/20 02:46:54
authorauliausu
permlinkkok-reward-postinganku-gak-naik-naik-ya-dear-steemians-mari-berbincang
votersteven.tjg
weight10000 (100.00%)
Transaction InfoBlock #20023377/Trx 66344bf9d227c829b70bc1f47ea0263d8a76b5e4
View Raw JSON Data
{
  "block": 20023377,
  "op": [
    "vote",
    {
      "author": "auliausu",
      "permlink": "kok-reward-postinganku-gak-naik-naik-ya-dear-steemians-mari-berbincang",
      "voter": "steven.tjg",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-20T02:46:54",
  "trx_id": "66344bf9d227c829b70bc1f47ea0263d8a76b5e4",
  "trx_in_block": 35,
  "virtual_op": 0
}
steven.tjgsent 15.023 SBD to @blocktrades- "9ef7071f-3275-4d7b-9e18-623e74961ceb"
2018/02/20 00:09:42
amount15.023 SBD
fromsteven.tjg
memo9ef7071f-3275-4d7b-9e18-623e74961ceb
toblocktrades
Transaction InfoBlock #20020233/Trx 4c92528556501a3bf461fbdff613c851e2005dd6
View Raw JSON Data
{
  "block": 20020233,
  "op": [
    "transfer",
    {
      "amount": "15.023 SBD",
      "from": "steven.tjg",
      "memo": "9ef7071f-3275-4d7b-9e18-623e74961ceb",
      "to": "blocktrades"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-20T00:09:42",
  "trx_id": "4c92528556501a3bf461fbdff613c851e2005dd6",
  "trx_in_block": 54,
  "virtual_op": 0
}
2018/02/19 23:37:42
authorsteven.tjg
permlinkhow-to-implement-shimmer-load-in-android
votercifer
weight8000 (80.00%)
Transaction InfoBlock #20019593/Trx 6f24b30b258ba054af4ef722924f0cef8b2b43aa
View Raw JSON Data
{
  "block": 20019593,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-shimmer-load-in-android",
      "voter": "cifer",
      "weight": 8000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-19T23:37:42",
  "trx_id": "6f24b30b258ba054af4ef722924f0cef8b2b43aa",
  "trx_in_block": 25,
  "virtual_op": 0
}
2018/02/19 23:36:51
authorcreon
bodyThank you for the contribution. It has been approved. You can contact us on [Discord](https://discord.gg/uTyJkNm). **[[utopian-moderator]](https://utopian.io/moderators)**
json metadata{"tags":["utopian-io"],"community":"utopian","app":"utopian/1.0.0"}
parent authorsteven.tjg
parent permlinkhow-to-implement-shimmer-load-in-android
permlinkre-steventjg-how-to-implement-shimmer-load-in-android-20180219t233651446z
title
Transaction InfoBlock #20019576/Trx dfec95837d3a76f449a8b11b3c392e63512ee1ae
View Raw JSON Data
{
  "block": 20019576,
  "op": [
    "comment",
    {
      "author": "creon",
      "body": "Thank you for the contribution. It has been approved.\n\nYou can contact us on [Discord](https://discord.gg/uTyJkNm).\n**[[utopian-moderator]](https://utopian.io/moderators)**",
      "json_metadata": "{\"tags\":[\"utopian-io\"],\"community\":\"utopian\",\"app\":\"utopian/1.0.0\"}",
      "parent_author": "steven.tjg",
      "parent_permlink": "how-to-implement-shimmer-load-in-android",
      "permlink": "re-steventjg-how-to-implement-shimmer-load-in-android-20180219t233651446z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-19T23:36:51",
  "trx_id": "dfec95837d3a76f449a8b11b3c392e63512ee1ae",
  "trx_in_block": 34,
  "virtual_op": 0
}
2018/02/19 23:36:33
authorsteven.tjg
body![cover.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519007804/fqhjqnvf7eyvmz52iwvs.png) <br> <a href="http://facebook.github.io/shimmer-android/">Facebook Shimmer</a> Hi, in this post, I will show you how to implement Shimmer Load in Android application. After reading this post hopefully you can implement shimmer load in your Android project. Alright let's get started. #### What Will I Learn? - Logic of how shimmer load works. - Implement shimmer load in your project. #### Requirements - Android Studio - Knowledge of Java #### Difficulty - Basic #### Tutorial Contents So maybe you are wondering, what exactly is shimmer load. This is a screenshot of Youtube apps on iOS. ![youtube-ios-shimmer.jpeg](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519008092/qdwvboxyeztothihfdhn.jpg) Shimmer load is basically a placeholder that is shown when your apps is loading, for example when fetching data from an API. <br> There are a lot of shimmer load library which works a bit different, but in this post I will be using a library from Facebook called <a href="https://github.com/facebook/shimmer-android">shimmer-android</a>. <br> The logic behind facebook shimmer load is basically switching view between two layout. In Android it is basically playing with layout visibility. <br><br> In this tutorial, I will make an example of searching movie data from imdb API. #### Curriculum #### 1. Install Dependency To install this dependency, simply add `implementation 'com.facebook.shimmer:shimmer:0.1.0@aar'` in your application `build.gradle` file. <br> This is my entire build.gradle file: ``` apply plugin: 'com.android.application' android { compileSdkVersion 27 buildToolsVersion '27.0.3' defaultConfig { applicationId "com.steven.example.shimmerloadexample" minSdkVersion 19 targetSdkVersion 27 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:27.0.2' implementation "com.android.support:recyclerview-v7:27.0.2" implementation 'com.facebook.shimmer:shimmer:0.1.0@aar' implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'com.squareup.retrofit2:converter-gson:2.3.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1' implementation 'com.github.bumptech.glide:glide:4.6.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' } ``` #### 2. Create A Placeholder The next thing is creating a placeholder for the shimmer load. For the movie list item I will have the end result looks like this: <br> ![item_movie.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519010926/xxniauqcuvzkv6oc6dzx.png) <br> So we need to create the place holder similar to our list item. The place holder I made looks like this: <br> ![placeholder.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519011163/rytm8mbidpjfcjxlezu8.png) <br> This is my entire placeholder file with background colorShimmer #DDDDDD: ``` <?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="160dp"> <View android:id="@+id/view_image" android:layout_width="120dp" android:layout_height="match_parent" android:layout_margin="8dp" android:background="@color/colorShimmer" /> <View android:id="@+id/view_title" android:layout_width="wrap_content" android:layout_height="48dp" android:layout_alignParentEnd="true" android:layout_margin="8dp" android:layout_toEndOf="@+id/view_image" android:background="@color/colorShimmer" /> <View android:layout_width="80dp" android:layout_height="24dp" android:layout_above="@id/view_type" android:layout_alignParentEnd="true" android:layout_margin="8dp" android:background="@color/colorShimmer" /> <View android:id="@+id/view_type" android:layout_width="160dp" android:layout_height="24dp" android:layout_alignParentBottom="true" android:layout_alignParentEnd="true" android:layout_margin="8dp" android:background="@color/colorShimmer" /> </RelativeLayout> ``` #### 3. Use Placeholder Now it's time to use the placeholder that we've created. In your activity/fragment layout add ShimmerFrameLayout with the place holder inside it. In my example I have ShimmerFrameLayout and RecyclerView, when fetching data ShimmerFrameLayout will be shown and starts its animaton, and RecyclerView will be hide. Once all the data has been fetch and added to RecyclerView, RecyclerView will be shown, and ShimmerFrameLayout will be hide and stop its animation. <br> My `activity_main.xml` file looks like this: <br> ``` <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:shimmer="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" android:orientation="vertical" tools:context="com.steven.example.shimmerloadexample.ui.MainActivity"> <android.support.v7.widget.SearchView android:id="@+id/search_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true" android:theme="@style/Theme.AppCompat.Light" app:queryHint="Search here" /> <com.facebook.shimmer.ShimmerFrameLayout android:id="@+id/shimmer_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" shimmer:duration="800"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <include layout="@layout/shimmer_placeholder" /> <include layout="@layout/shimmer_placeholder" /> <include layout="@layout/shimmer_placeholder" /> <include layout="@layout/shimmer_placeholder" /> <include layout="@layout/shimmer_placeholder" /> <include layout="@layout/shimmer_placeholder" /> </LinearLayout> </com.facebook.shimmer.ShimmerFrameLayout> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> ``` And my 'MainActivity.java' looks like this: ``` public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); private SearchView mSearchView; private ShimmerFrameLayout mShimmerLayout; private RecyclerView mRecyclerView; private RecyclerViewAdapter mAdapter; private List<Movie> mMovieList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSearchView = findViewById(R.id.search_view); mShimmerLayout = findViewById(R.id.shimmer_layout); mRecyclerView = findViewById(R.id.recycler_view); mSearchView.setIconified(false); mMovieList = new ArrayList<>(); mAdapter = new RecyclerViewAdapter(this); mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); mRecyclerView.setAdapter(mAdapter); mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { fetchData(); return false; } @Override public boolean onQueryTextChange(String newText) { return false; } }); } @Override protected void onPause() { super.onPause(); mShimmerLayout.stopShimmerAnimation(); } private void fetchData() { mShimmerLayout.setVisibility(View.VISIBLE); mShimmerLayout.startShimmerAnimation(); String keyword = mSearchView.getQuery().toString(); keyword = keyword.replace(" ", "+"); RetrofitSingleton.getInstance().getRestAPI().searchTitle(keyword, 1, Config.API_KEY).enqueue(new Callback<SearchMovie>() { @SuppressWarnings("ConstantConditions") @Override public void onResponse(@NonNull Call<SearchMovie> call, @NonNull Response<SearchMovie> response) { if (response.isSuccessful()) { mMovieList = response.body().Search; mAdapter.addItems(mMovieList); mAdapter.notifyDataSetChanged(); mShimmerLayout.stopShimmerAnimation(); mShimmerLayout.setVisibility(View.GONE); mRecyclerView.smoothScrollToPosition(0); } } @Override public void onFailure(@NonNull Call<SearchMovie> call, @NonNull Throwable t) { if (!call.isCanceled()) { t.printStackTrace(); } mShimmerLayout.stopShimmerAnimation(); } }); } } ``` #### 4. Final Result Now let's look at the result. <br> ![app.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013027/yrekcvhbns6155rcyklb.png) <br> In my example I have a search view. Let's try and search "black panther", once I press enter on the keyboard it will run `fetchData();` and inside it I have set the visibility of ShimmerFrameLayout to visible and start its animation. <br> ![load.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013232/n1bp4cvmccpt9ilror7i.png) <br><br> Once 'fetchData();` response is successful and data has been added into RecyclerViewAdapter, ShimmerFrameLayout visibility will be set to gone and animation will be stop. <br> ![final.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013404/tfpgxvdvrmnixrgbifk5.png) #### Documentation - You can check out facebook shimmer load library here: https://github.com/facebook/shimmer-android - If you want to check out the example I made in this post, you can visit here: https://github.com/steven-tjg/shimmering-load-example <br /><hr/><em>Posted on <a href="https://utopian.io/utopian-io/@steven.tjg/how-to-implement-shimmer-load-in-android">Utopian.io - Rewarding Open Source Contributors</a></em><hr/>
json metadata{"community":"utopian","app":"utopian/1.0.0","format":"markdown","repository":{"id":31441862,"name":"shimmer-android","full_name":"facebook/shimmer-android","html_url":"https://github.com/facebook/shimmer-android","fork":false,"owner":{"login":"facebook"}},"pullRequests":[],"platform":"github","type":"tutorials","tags":["utopian-io","tutorial","android","shimmer-load"],"users":["aar","color","id","android","style","layout","Override","SuppressWarnings","NonNull"],"links":["https://res.cloudinary.com/hpiynhbhq/image/upload/v1519007804/fqhjqnvf7eyvmz52iwvs.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519008092/qdwvboxyeztothihfdhn.jpg","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519010926/xxniauqcuvzkv6oc6dzx.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519011163/rytm8mbidpjfcjxlezu8.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013027/yrekcvhbns6155rcyklb.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013232/n1bp4cvmccpt9ilror7i.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013404/tfpgxvdvrmnixrgbifk5.png"],"image":["https://res.cloudinary.com/hpiynhbhq/image/upload/v1519007804/fqhjqnvf7eyvmz52iwvs.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519008092/qdwvboxyeztothihfdhn.jpg","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519010926/xxniauqcuvzkv6oc6dzx.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519011163/rytm8mbidpjfcjxlezu8.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013027/yrekcvhbns6155rcyklb.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013232/n1bp4cvmccpt9ilror7i.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013404/tfpgxvdvrmnixrgbifk5.png"],"moderator":{"account":"creon","time":"2018-02-19T23:36:33.392Z","reviewed":true,"pending":false,"flagged":false},"questions":[],"score":0}
parent author
parent permlinkutopian-io
permlinkhow-to-implement-shimmer-load-in-android
titleHow to Implement Shimmer Load in Android
Transaction InfoBlock #20019570/Trx 57adfd9f8ed30656b08b4eefde91c501671cf5b0
View Raw JSON Data
{
  "block": 20019570,
  "op": [
    "comment",
    {
      "author": "steven.tjg",
      "body": "![cover.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519007804/fqhjqnvf7eyvmz52iwvs.png)\n<br>\n<a href=\"http://facebook.github.io/shimmer-android/\">Facebook Shimmer</a>\n\nHi, in this post, I will show you how to implement Shimmer Load in Android application. After reading this post hopefully you can implement shimmer load in your Android project. Alright let's get started.\n\n#### What Will I Learn?\n- Logic of how shimmer load works.\n- Implement shimmer load in your project.\n\n#### Requirements\n- Android Studio\n- Knowledge of Java\n\n#### Difficulty\n- Basic\n\n#### Tutorial Contents\nSo maybe you are wondering, what exactly is shimmer load. This is a screenshot of Youtube apps on iOS.\n![youtube-ios-shimmer.jpeg](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519008092/qdwvboxyeztothihfdhn.jpg)\nShimmer load is basically a placeholder that is shown when your apps is loading, for example when fetching data from an API.\n<br>\nThere are a lot of shimmer load library which works a bit different, but in this post I will be using a library from Facebook called <a href=\"https://github.com/facebook/shimmer-android\">shimmer-android</a>.\n<br>\nThe logic behind facebook shimmer load is basically switching view between two layout. In Android it is basically playing with layout visibility.\n<br><br>\nIn this tutorial, I will make an example of searching movie data from imdb API.\n\n#### Curriculum\n#### 1. Install Dependency\nTo install this dependency, simply add `implementation 'com.facebook.shimmer:shimmer:0.1.0@aar'` in your application `build.gradle` file.\n<br>\nThis is my entire build.gradle file:\n```\napply plugin: 'com.android.application'\nandroid {\n    compileSdkVersion 27\n    buildToolsVersion '27.0.3'\n    defaultConfig {\n        applicationId \"com.steven.example.shimmerloadexample\"\n        minSdkVersion 19\n        targetSdkVersion 27\n        versionCode 1\n        versionName \"1.0\"\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n    }\n    buildTypes {\n        debug {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n}\ndependencies {\n    implementation fileTree(include: ['*.jar'], dir: 'libs')\n    implementation 'com.android.support:appcompat-v7:27.0.2'\n    implementation \"com.android.support:recyclerview-v7:27.0.2\"\n    implementation 'com.facebook.shimmer:shimmer:0.1.0@aar'\n    implementation 'com.squareup.retrofit2:retrofit:2.3.0'\n    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'\n    implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'\n    implementation 'com.github.bumptech.glide:glide:4.6.1'\n    annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1'\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'com.android.support.test:runner:1.0.1'\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'\n}\n```\n\n#### 2. Create A Placeholder\nThe next thing is creating a placeholder for the shimmer load. For the movie list item I will have the end result looks like this:\n<br>\n![item_movie.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519010926/xxniauqcuvzkv6oc6dzx.png)\n<br>\nSo we need to create the place holder similar to our list item. The place holder I made looks like this:\n<br>\n![placeholder.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519011163/rytm8mbidpjfcjxlezu8.png)\n<br>\nThis is my entire placeholder file with background colorShimmer #DDDDDD:\n```\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"160dp\">\n\n    <View\n        android:id=\"@+id/view_image\"\n        android:layout_width=\"120dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_margin=\"8dp\"\n        android:background=\"@color/colorShimmer\" />\n\n    <View\n        android:id=\"@+id/view_title\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"48dp\"\n        android:layout_alignParentEnd=\"true\"\n        android:layout_margin=\"8dp\"\n        android:layout_toEndOf=\"@+id/view_image\"\n        android:background=\"@color/colorShimmer\" />\n\n    <View\n        android:layout_width=\"80dp\"\n        android:layout_height=\"24dp\"\n        android:layout_above=\"@id/view_type\"\n        android:layout_alignParentEnd=\"true\"\n        android:layout_margin=\"8dp\"\n        android:background=\"@color/colorShimmer\" />\n\n    <View\n        android:id=\"@+id/view_type\"\n        android:layout_width=\"160dp\"\n        android:layout_height=\"24dp\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_alignParentEnd=\"true\"\n        android:layout_margin=\"8dp\"\n        android:background=\"@color/colorShimmer\" />\n\n</RelativeLayout>\n```\n\n#### 3. Use Placeholder\nNow it's time to use the placeholder that we've created. In your activity/fragment layout add ShimmerFrameLayout with the place holder inside it. In my example I have ShimmerFrameLayout and RecyclerView, when fetching data ShimmerFrameLayout will be shown and starts its animaton, and RecyclerView will be hide. Once all the data has been fetch and added to RecyclerView, RecyclerView will be shown, and ShimmerFrameLayout will be hide and stop its animation.\n<br>\nMy `activity_main.xml` file looks like this:\n<br>\n```\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:shimmer=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@android:color/white\"\n    android:orientation=\"vertical\"\n    tools:context=\"com.steven.example.shimmerloadexample.ui.MainActivity\">\n\n    <android.support.v7.widget.SearchView\n        android:id=\"@+id/search_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:focusable=\"true\"\n        android:focusableInTouchMode=\"true\"\n        android:theme=\"@style/Theme.AppCompat.Light\"\n        app:queryHint=\"Search here\" />\n\n    <com.facebook.shimmer.ShimmerFrameLayout\n        android:id=\"@+id/shimmer_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:visibility=\"gone\"\n        shimmer:duration=\"800\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\">\n\n            <include layout=\"@layout/shimmer_placeholder\" />\n\n            <include layout=\"@layout/shimmer_placeholder\" />\n\n            <include layout=\"@layout/shimmer_placeholder\" />\n\n            <include layout=\"@layout/shimmer_placeholder\" />\n\n            <include layout=\"@layout/shimmer_placeholder\" />\n\n            <include layout=\"@layout/shimmer_placeholder\" />\n\n        </LinearLayout>\n\n    </com.facebook.shimmer.ShimmerFrameLayout>\n\n    <android.support.v7.widget.RecyclerView\n        android:id=\"@+id/recycler_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" />\n\n</LinearLayout>\n```\n\nAnd my 'MainActivity.java' looks like this:\n```\npublic class MainActivity extends AppCompatActivity {\n\n    private static final String TAG = MainActivity.class.getSimpleName();\n\n    private SearchView mSearchView;\n    private ShimmerFrameLayout mShimmerLayout;\n    private RecyclerView mRecyclerView;\n    private RecyclerViewAdapter mAdapter;\n    private List<Movie> mMovieList;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        mSearchView = findViewById(R.id.search_view);\n        mShimmerLayout = findViewById(R.id.shimmer_layout);\n        mRecyclerView = findViewById(R.id.recycler_view);\n\n        mSearchView.setIconified(false);\n\n        mMovieList = new ArrayList<>();\n        mAdapter = new RecyclerViewAdapter(this);\n        mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));\n        mRecyclerView.setItemAnimator(new DefaultItemAnimator());\n        mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));\n        mRecyclerView.setAdapter(mAdapter);\n\n        mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {\n            @Override\n            public boolean onQueryTextSubmit(String query) {\n                fetchData();\n                return false;\n            }\n\n            @Override\n            public boolean onQueryTextChange(String newText) {\n                return false;\n            }\n        });\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n        mShimmerLayout.stopShimmerAnimation();\n    }\n\n    private void fetchData() {\n        mShimmerLayout.setVisibility(View.VISIBLE);\n        mShimmerLayout.startShimmerAnimation();\n        String keyword = mSearchView.getQuery().toString();\n        keyword = keyword.replace(\" \", \"+\");\n        RetrofitSingleton.getInstance().getRestAPI().searchTitle(keyword, 1, Config.API_KEY).enqueue(new Callback<SearchMovie>() {\n            @SuppressWarnings(\"ConstantConditions\")\n            @Override\n            public void onResponse(@NonNull Call<SearchMovie> call, @NonNull Response<SearchMovie> response) {\n                if (response.isSuccessful()) {\n                    mMovieList = response.body().Search;\n                    mAdapter.addItems(mMovieList);\n                    mAdapter.notifyDataSetChanged();\n                    mShimmerLayout.stopShimmerAnimation();\n                    mShimmerLayout.setVisibility(View.GONE);\n                    mRecyclerView.smoothScrollToPosition(0);\n                }\n            }\n\n            @Override\n            public void onFailure(@NonNull Call<SearchMovie> call, @NonNull Throwable t) {\n                if (!call.isCanceled()) {\n                    t.printStackTrace();\n                }\n                mShimmerLayout.stopShimmerAnimation();\n            }\n        });\n    }\n}\n```\n\n#### 4. Final Result\nNow let's look at the result.\n<br>\n![app.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013027/yrekcvhbns6155rcyklb.png)\n<br>\nIn my example I have a search view. Let's try and search \"black panther\", once I press enter on the keyboard it will run `fetchData();` and inside it I have set the visibility of ShimmerFrameLayout to visible and start its animation.\n<br>\n![load.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013232/n1bp4cvmccpt9ilror7i.png)\n<br><br>\nOnce 'fetchData();` response is successful and data has been added into RecyclerViewAdapter, ShimmerFrameLayout visibility will be set to gone and animation will be stop.\n<br>\n![final.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013404/tfpgxvdvrmnixrgbifk5.png)\n\n#### Documentation\n- You can check out facebook shimmer load library here: https://github.com/facebook/shimmer-android\n- If you want to check out the example I made in this post, you can visit here: https://github.com/steven-tjg/shimmering-load-example\n    \n\n<br /><hr/><em>Posted on <a href=\"https://utopian.io/utopian-io/@steven.tjg/how-to-implement-shimmer-load-in-android\">Utopian.io -  Rewarding Open Source Contributors</a></em><hr/>",
      "json_metadata": "{\"community\":\"utopian\",\"app\":\"utopian/1.0.0\",\"format\":\"markdown\",\"repository\":{\"id\":31441862,\"name\":\"shimmer-android\",\"full_name\":\"facebook/shimmer-android\",\"html_url\":\"https://github.com/facebook/shimmer-android\",\"fork\":false,\"owner\":{\"login\":\"facebook\"}},\"pullRequests\":[],\"platform\":\"github\",\"type\":\"tutorials\",\"tags\":[\"utopian-io\",\"tutorial\",\"android\",\"shimmer-load\"],\"users\":[\"aar\",\"color\",\"id\",\"android\",\"style\",\"layout\",\"Override\",\"SuppressWarnings\",\"NonNull\"],\"links\":[\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519007804/fqhjqnvf7eyvmz52iwvs.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519008092/qdwvboxyeztothihfdhn.jpg\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519010926/xxniauqcuvzkv6oc6dzx.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519011163/rytm8mbidpjfcjxlezu8.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013027/yrekcvhbns6155rcyklb.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013232/n1bp4cvmccpt9ilror7i.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013404/tfpgxvdvrmnixrgbifk5.png\"],\"image\":[\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519007804/fqhjqnvf7eyvmz52iwvs.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519008092/qdwvboxyeztothihfdhn.jpg\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519010926/xxniauqcuvzkv6oc6dzx.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519011163/rytm8mbidpjfcjxlezu8.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013027/yrekcvhbns6155rcyklb.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013232/n1bp4cvmccpt9ilror7i.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013404/tfpgxvdvrmnixrgbifk5.png\"],\"moderator\":{\"account\":\"creon\",\"time\":\"2018-02-19T23:36:33.392Z\",\"reviewed\":true,\"pending\":false,\"flagged\":false},\"questions\":[],\"score\":0}",
      "parent_author": "",
      "parent_permlink": "utopian-io",
      "permlink": "how-to-implement-shimmer-load-in-android",
      "title": "How to Implement Shimmer Load in Android"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-19T23:36:33",
  "trx_id": "57adfd9f8ed30656b08b4eefde91c501671cf5b0",
  "trx_in_block": 51,
  "virtual_op": 0
}
2018/02/19 15:41:39
authorauliausu
permlinkfirst-indonesian-steemian-national-meetup-sejarah-dalam-keceriaan-cimahi-16-februari-2018
votersteven.tjg
weight10000 (100.00%)
Transaction InfoBlock #20010094/Trx e0df74312e9b33380882f39bad1376f69f773cb9
View Raw JSON Data
{
  "block": 20010094,
  "op": [
    "vote",
    {
      "author": "auliausu",
      "permlink": "first-indonesian-steemian-national-meetup-sejarah-dalam-keceriaan-cimahi-16-februari-2018",
      "voter": "steven.tjg",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-19T15:41:39",
  "trx_id": "e0df74312e9b33380882f39bad1376f69f773cb9",
  "trx_in_block": 38,
  "virtual_op": 0
}
2018/02/19 06:53:57
authorsteven.tjg
permlinkhow-to-implement-shimmer-load-in-android
votersteven.tjg
weight10000 (100.00%)
Transaction InfoBlock #19999542/Trx 9904ce10ba85d11c5db8c6f1e72a38b1c023d110
View Raw JSON Data
{
  "block": 19999542,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-shimmer-load-in-android",
      "voter": "steven.tjg",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-19T06:53:57",
  "trx_id": "9904ce10ba85d11c5db8c6f1e72a38b1c023d110",
  "trx_in_block": 22,
  "virtual_op": 0
}
2018/02/19 04:38:24
authorsteven.tjg
permlinkhow-to-implement-shimmer-load-in-android
votermurez-nst
weight10000 (100.00%)
Transaction InfoBlock #19996831/Trx 47b6c5c38f6427617a6973f8f67ba12717f40d80
View Raw JSON Data
{
  "block": 19996831,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-shimmer-load-in-android",
      "voter": "murez-nst",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-19T04:38:24",
  "trx_id": "47b6c5c38f6427617a6973f8f67ba12717f40d80",
  "trx_in_block": 1,
  "virtual_op": 0
}
2018/02/19 04:31:15
authorsteven.tjg
permlinkhow-to-implement-shimmer-load-in-android
voterteam
weight1000 (10.00%)
Transaction InfoBlock #19996688/Trx 4ca49b1889b6ebfa93ec56df95920a020806471a
View Raw JSON Data
{
  "block": 19996688,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-shimmer-load-in-android",
      "voter": "team",
      "weight": 1000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-19T04:31:15",
  "trx_id": "4ca49b1889b6ebfa93ec56df95920a020806471a",
  "trx_in_block": 44,
  "virtual_op": 0
}
2018/02/19 04:15:45
authorsteemitstats
body@steven.tjg, Contribution to open source project, I like you and upvote.
json metadata{"tags":["utopian-io"]}
parent authorsteven.tjg
parent permlinkhow-to-implement-shimmer-load-in-android
permlink20180219t041541684z-post
title
Transaction InfoBlock #19996378/Trx 49ac6a22c9da6f43a9449330368821069ea22b60
View Raw JSON Data
{
  "block": 19996378,
  "op": [
    "comment",
    {
      "author": "steemitstats",
      "body": "@steven.tjg, Contribution to open source project, I like you and upvote.",
      "json_metadata": "{\"tags\":[\"utopian-io\"]}",
      "parent_author": "steven.tjg",
      "parent_permlink": "how-to-implement-shimmer-load-in-android",
      "permlink": "20180219t041541684z-post",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-19T04:15:45",
  "trx_id": "49ac6a22c9da6f43a9449330368821069ea22b60",
  "trx_in_block": 25,
  "virtual_op": 0
}
2018/02/19 04:15:42
authorsteven.tjg
permlinkhow-to-implement-shimmer-load-in-android
votersteemitstats
weight500 (5.00%)
Transaction InfoBlock #19996377/Trx 9d1ba41cd62d381db6e7d9249be4b50aab3cffe9
View Raw JSON Data
{
  "block": 19996377,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-shimmer-load-in-android",
      "voter": "steemitstats",
      "weight": 500
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-19T04:15:42",
  "trx_id": "9d1ba41cd62d381db6e7d9249be4b50aab3cffe9",
  "trx_in_block": 4,
  "virtual_op": 0
}
2018/02/19 04:12:45
allow curation rewardstrue
allow votestrue
authorsteven.tjg
extensions[[0,{"beneficiaries":[{"account":"utopian.pay","weight":2500}]}]]
max accepted payout1000000.000 SBD
percent steem dollars10000
permlinkhow-to-implement-shimmer-load-in-android
Transaction InfoBlock #19996318/Trx 19776a80a178e5bfd013b23246ce8ab9604300dc
View Raw JSON Data
{
  "block": 19996318,
  "op": [
    "comment_options",
    {
      "allow_curation_rewards": true,
      "allow_votes": true,
      "author": "steven.tjg",
      "extensions": [
        [
          0,
          {
            "beneficiaries": [
              {
                "account": "utopian.pay",
                "weight": 2500
              }
            ]
          }
        ]
      ],
      "max_accepted_payout": "1000000.000 SBD",
      "percent_steem_dollars": 10000,
      "permlink": "how-to-implement-shimmer-load-in-android"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-19T04:12:45",
  "trx_id": "19776a80a178e5bfd013b23246ce8ab9604300dc",
  "trx_in_block": 42,
  "virtual_op": 0
}
2018/02/19 04:12:45
authorsteven.tjg
body![cover.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519007804/fqhjqnvf7eyvmz52iwvs.png) <br> <a href="http://facebook.github.io/shimmer-android/">Facebook Shimmer</a> Hi, in this post, I will show you how to implement Shimmer Load in Android application. After reading this post hopefully you can implement shimmer load in your Android project. Alright let's get started. #### What Will I Learn? - Logic of how shimmer load works. - Implement shimmer load in your project. #### Requirements - Android Studio - Knowledge of Java #### Difficulty - Basic #### Tutorial Contents So maybe you are wondering, what exactly is shimmer load. This is a screenshot of Youtube apps on iOS. ![youtube-ios-shimmer.jpeg](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519008092/qdwvboxyeztothihfdhn.jpg) Shimmer load is basically a placeholder that is shown when your apps is loading, for example when fetching data from an API. <br> There are a lot of shimmer load library which works a bit different, but in this post I will be using a library from Facebook called <a href="https://github.com/facebook/shimmer-android">shimmer-android</a>. <br> The logic behind facebook shimmer load is basically switching view between two layout. In Android it is basically playing with layout visibility. <br><br> In this tutorial, I will make an example of searching movie data from imdb API. #### Curriculum #### 1. Install Dependency To install this dependency, simply add `implementation 'com.facebook.shimmer:shimmer:0.1.0@aar'` in your application `build.gradle` file. <br> This is my entire build.gradle file: ``` apply plugin: 'com.android.application' android { compileSdkVersion 27 buildToolsVersion '27.0.3' defaultConfig { applicationId "com.steven.example.shimmerloadexample" minSdkVersion 19 targetSdkVersion 27 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:27.0.2' implementation "com.android.support:recyclerview-v7:27.0.2" implementation 'com.facebook.shimmer:shimmer:0.1.0@aar' implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'com.squareup.retrofit2:converter-gson:2.3.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1' implementation 'com.github.bumptech.glide:glide:4.6.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' } ``` #### 2. Create A Placeholder The next thing is creating a placeholder for the shimmer load. For the movie list item I will have the end result looks like this: <br> ![item_movie.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519010926/xxniauqcuvzkv6oc6dzx.png) <br> So we need to create the place holder similar to our list item. The place holder I made looks like this: <br> ![placeholder.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519011163/rytm8mbidpjfcjxlezu8.png) <br> This is my entire placeholder file with background colorShimmer #DDDDDD: ``` <?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="160dp"> <View android:id="@+id/view_image" android:layout_width="120dp" android:layout_height="match_parent" android:layout_margin="8dp" android:background="@color/colorShimmer" /> <View android:id="@+id/view_title" android:layout_width="wrap_content" android:layout_height="48dp" android:layout_alignParentEnd="true" android:layout_margin="8dp" android:layout_toEndOf="@+id/view_image" android:background="@color/colorShimmer" /> <View android:layout_width="80dp" android:layout_height="24dp" android:layout_above="@id/view_type" android:layout_alignParentEnd="true" android:layout_margin="8dp" android:background="@color/colorShimmer" /> <View android:id="@+id/view_type" android:layout_width="160dp" android:layout_height="24dp" android:layout_alignParentBottom="true" android:layout_alignParentEnd="true" android:layout_margin="8dp" android:background="@color/colorShimmer" /> </RelativeLayout> ``` #### 3. Use Placeholder Now it's time to use the placeholder that we've created. In your activity/fragment layout add ShimmerFrameLayout with the place holder inside it. In my example I have ShimmerFrameLayout and RecyclerView, when fetching data ShimmerFrameLayout will be shown and starts its animaton, and RecyclerView will be hide. Once all the data has been fetch and added to RecyclerView, RecyclerView will be shown, and ShimmerFrameLayout will be hide and stop its animation. <br> My `activity_main.xml` file looks like this: <br> ``` <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:shimmer="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" android:orientation="vertical" tools:context="com.steven.example.shimmerloadexample.ui.MainActivity"> <android.support.v7.widget.SearchView android:id="@+id/search_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true" android:theme="@style/Theme.AppCompat.Light" app:queryHint="Search here" /> <com.facebook.shimmer.ShimmerFrameLayout android:id="@+id/shimmer_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" shimmer:duration="800"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <include layout="@layout/shimmer_placeholder" /> <include layout="@layout/shimmer_placeholder" /> <include layout="@layout/shimmer_placeholder" /> <include layout="@layout/shimmer_placeholder" /> <include layout="@layout/shimmer_placeholder" /> <include layout="@layout/shimmer_placeholder" /> </LinearLayout> </com.facebook.shimmer.ShimmerFrameLayout> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> ``` And my 'MainActivity.java' looks like this: ``` public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); private SearchView mSearchView; private ShimmerFrameLayout mShimmerLayout; private RecyclerView mRecyclerView; private RecyclerViewAdapter mAdapter; private List<Movie> mMovieList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSearchView = findViewById(R.id.search_view); mShimmerLayout = findViewById(R.id.shimmer_layout); mRecyclerView = findViewById(R.id.recycler_view); mSearchView.setIconified(false); mMovieList = new ArrayList<>(); mAdapter = new RecyclerViewAdapter(this); mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); mRecyclerView.setAdapter(mAdapter); mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { fetchData(); return false; } @Override public boolean onQueryTextChange(String newText) { return false; } }); } @Override protected void onPause() { super.onPause(); mShimmerLayout.stopShimmerAnimation(); } private void fetchData() { mShimmerLayout.setVisibility(View.VISIBLE); mShimmerLayout.startShimmerAnimation(); String keyword = mSearchView.getQuery().toString(); keyword = keyword.replace(" ", "+"); RetrofitSingleton.getInstance().getRestAPI().searchTitle(keyword, 1, Config.API_KEY).enqueue(new Callback<SearchMovie>() { @SuppressWarnings("ConstantConditions") @Override public void onResponse(@NonNull Call<SearchMovie> call, @NonNull Response<SearchMovie> response) { if (response.isSuccessful()) { mMovieList = response.body().Search; mAdapter.addItems(mMovieList); mAdapter.notifyDataSetChanged(); mShimmerLayout.stopShimmerAnimation(); mShimmerLayout.setVisibility(View.GONE); mRecyclerView.smoothScrollToPosition(0); } } @Override public void onFailure(@NonNull Call<SearchMovie> call, @NonNull Throwable t) { if (!call.isCanceled()) { t.printStackTrace(); } mShimmerLayout.stopShimmerAnimation(); } }); } } ``` #### 4. Final Result Now let's look at the result. <br> ![app.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013027/yrekcvhbns6155rcyklb.png) <br> In my example I have a search view. Let's try and search "black panther", once I press enter on the keyboard it will run `fetchData();` and inside it I have set the visibility of ShimmerFrameLayout to visible and start its animation. <br> ![load.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013232/n1bp4cvmccpt9ilror7i.png) <br><br> Once 'fetchData();` response is successful and data has been added into RecyclerViewAdapter, ShimmerFrameLayout visibility will be set to gone and animation will be stop. <br> ![final.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013404/tfpgxvdvrmnixrgbifk5.png) #### Documentation - You can check out facebook shimmer load library here: https://github.com/facebook/shimmer-android - If you want to check out the example I made in this post, you can visit here: https://github.com/steven-tjg/shimmering-load-example <br /><hr/><em>Posted on <a href="https://utopian.io/utopian-io/@steven.tjg/how-to-implement-shimmer-load-in-android">Utopian.io - Rewarding Open Source Contributors</a></em><hr/>
json metadata{"community":"utopian","app":"utopian/1.0.0","format":"markdown","repository":{"id":31441862,"name":"shimmer-android","full_name":"facebook/shimmer-android","html_url":"https://github.com/facebook/shimmer-android","fork":false,"owner":{"login":"facebook"}},"pullRequests":[],"platform":"github","type":"tutorials","tags":["utopian-io","tutorial","android","shimmer-load"],"users":["aar","color","id","android","style","layout","Override","SuppressWarnings","NonNull"],"links":["https://res.cloudinary.com/hpiynhbhq/image/upload/v1519007804/fqhjqnvf7eyvmz52iwvs.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519008092/qdwvboxyeztothihfdhn.jpg","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519010926/xxniauqcuvzkv6oc6dzx.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519011163/rytm8mbidpjfcjxlezu8.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013027/yrekcvhbns6155rcyklb.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013232/n1bp4cvmccpt9ilror7i.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013404/tfpgxvdvrmnixrgbifk5.png"],"image":["https://res.cloudinary.com/hpiynhbhq/image/upload/v1519007804/fqhjqnvf7eyvmz52iwvs.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519008092/qdwvboxyeztothihfdhn.jpg","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519010926/xxniauqcuvzkv6oc6dzx.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519011163/rytm8mbidpjfcjxlezu8.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013027/yrekcvhbns6155rcyklb.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013232/n1bp4cvmccpt9ilror7i.png","https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013404/tfpgxvdvrmnixrgbifk5.png"]}
parent author
parent permlinkutopian-io
permlinkhow-to-implement-shimmer-load-in-android
titleHow to Implement Shimmer Load in Android
Transaction InfoBlock #19996318/Trx 19776a80a178e5bfd013b23246ce8ab9604300dc
View Raw JSON Data
{
  "block": 19996318,
  "op": [
    "comment",
    {
      "author": "steven.tjg",
      "body": "![cover.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519007804/fqhjqnvf7eyvmz52iwvs.png)\n<br>\n<a href=\"http://facebook.github.io/shimmer-android/\">Facebook Shimmer</a>\n\nHi, in this post, I will show you how to implement Shimmer Load in Android application. After reading this post hopefully you can implement shimmer load in your Android project. Alright let's get started.\n\n#### What Will I Learn?\n- Logic of how shimmer load works.\n- Implement shimmer load in your project.\n\n#### Requirements\n- Android Studio\n- Knowledge of Java\n\n#### Difficulty\n- Basic\n\n#### Tutorial Contents\nSo maybe you are wondering, what exactly is shimmer load. This is a screenshot of Youtube apps on iOS.\n![youtube-ios-shimmer.jpeg](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519008092/qdwvboxyeztothihfdhn.jpg)\nShimmer load is basically a placeholder that is shown when your apps is loading, for example when fetching data from an API.\n<br>\nThere are a lot of shimmer load library which works a bit different, but in this post I will be using a library from Facebook called <a href=\"https://github.com/facebook/shimmer-android\">shimmer-android</a>.\n<br>\nThe logic behind facebook shimmer load is basically switching view between two layout. In Android it is basically playing with layout visibility.\n<br><br>\nIn this tutorial, I will make an example of searching movie data from imdb API.\n\n#### Curriculum\n#### 1. Install Dependency\nTo install this dependency, simply add `implementation 'com.facebook.shimmer:shimmer:0.1.0@aar'` in your application `build.gradle` file.\n<br>\nThis is my entire build.gradle file:\n```\napply plugin: 'com.android.application'\nandroid {\n    compileSdkVersion 27\n    buildToolsVersion '27.0.3'\n    defaultConfig {\n        applicationId \"com.steven.example.shimmerloadexample\"\n        minSdkVersion 19\n        targetSdkVersion 27\n        versionCode 1\n        versionName \"1.0\"\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n    }\n    buildTypes {\n        debug {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n}\ndependencies {\n    implementation fileTree(include: ['*.jar'], dir: 'libs')\n    implementation 'com.android.support:appcompat-v7:27.0.2'\n    implementation \"com.android.support:recyclerview-v7:27.0.2\"\n    implementation 'com.facebook.shimmer:shimmer:0.1.0@aar'\n    implementation 'com.squareup.retrofit2:retrofit:2.3.0'\n    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'\n    implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'\n    implementation 'com.github.bumptech.glide:glide:4.6.1'\n    annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1'\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'com.android.support.test:runner:1.0.1'\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'\n}\n```\n\n#### 2. Create A Placeholder\nThe next thing is creating a placeholder for the shimmer load. For the movie list item I will have the end result looks like this:\n<br>\n![item_movie.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519010926/xxniauqcuvzkv6oc6dzx.png)\n<br>\nSo we need to create the place holder similar to our list item. The place holder I made looks like this:\n<br>\n![placeholder.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519011163/rytm8mbidpjfcjxlezu8.png)\n<br>\nThis is my entire placeholder file with background colorShimmer #DDDDDD:\n```\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"160dp\">\n\n    <View\n        android:id=\"@+id/view_image\"\n        android:layout_width=\"120dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_margin=\"8dp\"\n        android:background=\"@color/colorShimmer\" />\n\n    <View\n        android:id=\"@+id/view_title\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"48dp\"\n        android:layout_alignParentEnd=\"true\"\n        android:layout_margin=\"8dp\"\n        android:layout_toEndOf=\"@+id/view_image\"\n        android:background=\"@color/colorShimmer\" />\n\n    <View\n        android:layout_width=\"80dp\"\n        android:layout_height=\"24dp\"\n        android:layout_above=\"@id/view_type\"\n        android:layout_alignParentEnd=\"true\"\n        android:layout_margin=\"8dp\"\n        android:background=\"@color/colorShimmer\" />\n\n    <View\n        android:id=\"@+id/view_type\"\n        android:layout_width=\"160dp\"\n        android:layout_height=\"24dp\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_alignParentEnd=\"true\"\n        android:layout_margin=\"8dp\"\n        android:background=\"@color/colorShimmer\" />\n\n</RelativeLayout>\n```\n\n#### 3. Use Placeholder\nNow it's time to use the placeholder that we've created. In your activity/fragment layout add ShimmerFrameLayout with the place holder inside it. In my example I have ShimmerFrameLayout and RecyclerView, when fetching data ShimmerFrameLayout will be shown and starts its animaton, and RecyclerView will be hide. Once all the data has been fetch and added to RecyclerView, RecyclerView will be shown, and ShimmerFrameLayout will be hide and stop its animation.\n<br>\nMy `activity_main.xml` file looks like this:\n<br>\n```\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:shimmer=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@android:color/white\"\n    android:orientation=\"vertical\"\n    tools:context=\"com.steven.example.shimmerloadexample.ui.MainActivity\">\n\n    <android.support.v7.widget.SearchView\n        android:id=\"@+id/search_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:focusable=\"true\"\n        android:focusableInTouchMode=\"true\"\n        android:theme=\"@style/Theme.AppCompat.Light\"\n        app:queryHint=\"Search here\" />\n\n    <com.facebook.shimmer.ShimmerFrameLayout\n        android:id=\"@+id/shimmer_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:visibility=\"gone\"\n        shimmer:duration=\"800\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\">\n\n            <include layout=\"@layout/shimmer_placeholder\" />\n\n            <include layout=\"@layout/shimmer_placeholder\" />\n\n            <include layout=\"@layout/shimmer_placeholder\" />\n\n            <include layout=\"@layout/shimmer_placeholder\" />\n\n            <include layout=\"@layout/shimmer_placeholder\" />\n\n            <include layout=\"@layout/shimmer_placeholder\" />\n\n        </LinearLayout>\n\n    </com.facebook.shimmer.ShimmerFrameLayout>\n\n    <android.support.v7.widget.RecyclerView\n        android:id=\"@+id/recycler_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" />\n\n</LinearLayout>\n```\n\nAnd my 'MainActivity.java' looks like this:\n```\npublic class MainActivity extends AppCompatActivity {\n\n    private static final String TAG = MainActivity.class.getSimpleName();\n\n    private SearchView mSearchView;\n    private ShimmerFrameLayout mShimmerLayout;\n    private RecyclerView mRecyclerView;\n    private RecyclerViewAdapter mAdapter;\n    private List<Movie> mMovieList;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        mSearchView = findViewById(R.id.search_view);\n        mShimmerLayout = findViewById(R.id.shimmer_layout);\n        mRecyclerView = findViewById(R.id.recycler_view);\n\n        mSearchView.setIconified(false);\n\n        mMovieList = new ArrayList<>();\n        mAdapter = new RecyclerViewAdapter(this);\n        mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));\n        mRecyclerView.setItemAnimator(new DefaultItemAnimator());\n        mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));\n        mRecyclerView.setAdapter(mAdapter);\n\n        mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {\n            @Override\n            public boolean onQueryTextSubmit(String query) {\n                fetchData();\n                return false;\n            }\n\n            @Override\n            public boolean onQueryTextChange(String newText) {\n                return false;\n            }\n        });\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n        mShimmerLayout.stopShimmerAnimation();\n    }\n\n    private void fetchData() {\n        mShimmerLayout.setVisibility(View.VISIBLE);\n        mShimmerLayout.startShimmerAnimation();\n        String keyword = mSearchView.getQuery().toString();\n        keyword = keyword.replace(\" \", \"+\");\n        RetrofitSingleton.getInstance().getRestAPI().searchTitle(keyword, 1, Config.API_KEY).enqueue(new Callback<SearchMovie>() {\n            @SuppressWarnings(\"ConstantConditions\")\n            @Override\n            public void onResponse(@NonNull Call<SearchMovie> call, @NonNull Response<SearchMovie> response) {\n                if (response.isSuccessful()) {\n                    mMovieList = response.body().Search;\n                    mAdapter.addItems(mMovieList);\n                    mAdapter.notifyDataSetChanged();\n                    mShimmerLayout.stopShimmerAnimation();\n                    mShimmerLayout.setVisibility(View.GONE);\n                    mRecyclerView.smoothScrollToPosition(0);\n                }\n            }\n\n            @Override\n            public void onFailure(@NonNull Call<SearchMovie> call, @NonNull Throwable t) {\n                if (!call.isCanceled()) {\n                    t.printStackTrace();\n                }\n                mShimmerLayout.stopShimmerAnimation();\n            }\n        });\n    }\n}\n```\n\n#### 4. Final Result\nNow let's look at the result.\n<br>\n![app.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013027/yrekcvhbns6155rcyklb.png)\n<br>\nIn my example I have a search view. Let's try and search \"black panther\", once I press enter on the keyboard it will run `fetchData();` and inside it I have set the visibility of ShimmerFrameLayout to visible and start its animation.\n<br>\n![load.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013232/n1bp4cvmccpt9ilror7i.png)\n<br><br>\nOnce 'fetchData();` response is successful and data has been added into RecyclerViewAdapter, ShimmerFrameLayout visibility will be set to gone and animation will be stop.\n<br>\n![final.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013404/tfpgxvdvrmnixrgbifk5.png)\n\n#### Documentation\n- You can check out facebook shimmer load library here: https://github.com/facebook/shimmer-android\n- If you want to check out the example I made in this post, you can visit here: https://github.com/steven-tjg/shimmering-load-example\n    \n\n<br /><hr/><em>Posted on <a href=\"https://utopian.io/utopian-io/@steven.tjg/how-to-implement-shimmer-load-in-android\">Utopian.io -  Rewarding Open Source Contributors</a></em><hr/>",
      "json_metadata": "{\"community\":\"utopian\",\"app\":\"utopian/1.0.0\",\"format\":\"markdown\",\"repository\":{\"id\":31441862,\"name\":\"shimmer-android\",\"full_name\":\"facebook/shimmer-android\",\"html_url\":\"https://github.com/facebook/shimmer-android\",\"fork\":false,\"owner\":{\"login\":\"facebook\"}},\"pullRequests\":[],\"platform\":\"github\",\"type\":\"tutorials\",\"tags\":[\"utopian-io\",\"tutorial\",\"android\",\"shimmer-load\"],\"users\":[\"aar\",\"color\",\"id\",\"android\",\"style\",\"layout\",\"Override\",\"SuppressWarnings\",\"NonNull\"],\"links\":[\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519007804/fqhjqnvf7eyvmz52iwvs.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519008092/qdwvboxyeztothihfdhn.jpg\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519010926/xxniauqcuvzkv6oc6dzx.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519011163/rytm8mbidpjfcjxlezu8.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013027/yrekcvhbns6155rcyklb.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013232/n1bp4cvmccpt9ilror7i.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013404/tfpgxvdvrmnixrgbifk5.png\"],\"image\":[\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519007804/fqhjqnvf7eyvmz52iwvs.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519008092/qdwvboxyeztothihfdhn.jpg\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519010926/xxniauqcuvzkv6oc6dzx.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519011163/rytm8mbidpjfcjxlezu8.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013027/yrekcvhbns6155rcyklb.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013232/n1bp4cvmccpt9ilror7i.png\",\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1519013404/tfpgxvdvrmnixrgbifk5.png\"]}",
      "parent_author": "",
      "parent_permlink": "utopian-io",
      "permlink": "how-to-implement-shimmer-load-in-android",
      "title": "How to Implement Shimmer Load in Android"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-19T04:12:45",
  "trx_id": "19776a80a178e5bfd013b23246ce8ab9604300dc",
  "trx_in_block": 42,
  "virtual_op": 0
}
2018/02/18 04:56:54
authoralfarisi94
permlinkhow-to-use-database-eloquent-in-slim
votersteven.tjg
weight10000 (100.00%)
Transaction InfoBlock #19968403/Trx 6c9b67f9f19448b1e5f79e78b2e8ff9e0b0b8e0b
View Raw JSON Data
{
  "block": 19968403,
  "op": [
    "vote",
    {
      "author": "alfarisi94",
      "permlink": "how-to-use-database-eloquent-in-slim",
      "voter": "steven.tjg",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-18T04:56:54",
  "trx_id": "6c9b67f9f19448b1e5f79e78b2e8ff9e0b0b8e0b",
  "trx_in_block": 26,
  "virtual_op": 0
}
2018/02/17 04:39:21
authoralfarisi94
permlinkhow-to-use-twig-templating-in-slim
votersteven.tjg
weight10000 (100.00%)
Transaction InfoBlock #19939259/Trx 4eda8883938c8bef6d8e9795a4772fba8ae557ad
View Raw JSON Data
{
  "block": 19939259,
  "op": [
    "vote",
    {
      "author": "alfarisi94",
      "permlink": "how-to-use-twig-templating-in-slim",
      "voter": "steven.tjg",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-17T04:39:21",
  "trx_id": "4eda8883938c8bef6d8e9795a4772fba8ae557ad",
  "trx_in_block": 37,
  "virtual_op": 0
}
2018/02/16 06:01:42
authordanielniklaus
permlinktele-north-sumatera-indonesia--2018-02-16-01-59-12
votersteven.tjg
weight10000 (100.00%)
Transaction InfoBlock #19912131/Trx af00f1defc9bc0ef37b95a6370ec03e86f8e808d
View Raw JSON Data
{
  "block": 19912131,
  "op": [
    "vote",
    {
      "author": "danielniklaus",
      "permlink": "tele-north-sumatera-indonesia--2018-02-16-01-59-12",
      "voter": "steven.tjg",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-16T06:01:42",
  "trx_id": "af00f1defc9bc0ef37b95a6370ec03e86f8e808d",
  "trx_in_block": 14,
  "virtual_op": 0
}
2018/02/09 07:42:21
authoralfarisi94
permlinkhow-to-make-step-progress-bar-only-using-css
votersteven.tjg
weight10000 (100.00%)
Transaction InfoBlock #19712712/Trx e2dc589af4313af1ac2a158930e07f2ac49467ed
View Raw JSON Data
{
  "block": 19712712,
  "op": [
    "vote",
    {
      "author": "alfarisi94",
      "permlink": "how-to-make-step-progress-bar-only-using-css",
      "voter": "steven.tjg",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-09T07:42:21",
  "trx_id": "e2dc589af4313af1ac2a158930e07f2ac49467ed",
  "trx_in_block": 28,
  "virtual_op": 0
}
steemdelegated 10.555 SP to @steven.tjg
2018/02/06 15:40:03
delegateesteven.tjg
delegatorsteem
vesting shares17167.522781 VESTS
Transaction InfoBlock #19636139/Trx 87c2412e6cbd57f54ee667dc66a22f6319c982ab
View Raw JSON Data
{
  "block": 19636139,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "steven.tjg",
      "delegator": "steem",
      "vesting_shares": "17167.522781 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-06T15:40:03",
  "trx_id": "87c2412e6cbd57f54ee667dc66a22f6319c982ab",
  "trx_in_block": 8,
  "virtual_op": 0
}
steven.tjgclaimed reward balance: 7.359 SBD, 2.353 SP
2018/02/06 14:10:33
accountsteven.tjg
reward sbd7.359 SBD
reward steem0.000 STEEM
reward vests3827.062703 VESTS
Transaction InfoBlock #19634349/Trx a5c672e71eb93e195e3464030dd9f12e7ec4eb51
View Raw JSON Data
{
  "block": 19634349,
  "op": [
    "claim_reward_balance",
    {
      "account": "steven.tjg",
      "reward_sbd": "7.359 SBD",
      "reward_steem": "0.000 STEEM",
      "reward_vests": "3827.062703 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-06T14:10:33",
  "trx_id": "a5c672e71eb93e195e3464030dd9f12e7ec4eb51",
  "trx_in_block": 10,
  "virtual_op": 0
}
steven.tjgreceived 7.359 SBD, 2.349 SP author reward for @steven.tjg / how-to-use-volley-in-android-to-make-network-call
2018/02/06 11:42:24
authorsteven.tjg
permlinkhow-to-use-volley-in-android-to-make-network-call
sbd payout7.359 SBD
steem payout0.000 STEEM
vesting payout3820.926312 VESTS
Transaction InfoBlock #19631387/Virtual Operation #15
View Raw JSON Data
{
  "block": 19631387,
  "op": [
    "author_reward",
    {
      "author": "steven.tjg",
      "permlink": "how-to-use-volley-in-android-to-make-network-call",
      "sbd_payout": "7.359 SBD",
      "steem_payout": "0.000 STEEM",
      "vesting_payout": "3820.926312 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-06T11:42:24",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 15
}
utopian.payreceived 1.566 SP benefactor reward from @steven.tjg
2018/02/06 11:42:24
authorsteven.tjg
benefactorutopian.pay
permlinkhow-to-use-volley-in-android-to-make-network-call
sbd payout0.000 SBD
steem payout0.000 STEEM
vesting payout2546.602386 VESTS
Transaction InfoBlock #19631387/Virtual Operation #14
View Raw JSON Data
{
  "block": 19631387,
  "op": [
    "comment_benefactor_reward",
    {
      "author": "steven.tjg",
      "benefactor": "utopian.pay",
      "permlink": "how-to-use-volley-in-android-to-make-network-call",
      "sbd_payout": "0.000 SBD",
      "steem_payout": "0.000 STEEM",
      "vesting_payout": "2546.602386 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-06T11:42:24",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 14
}
2018/02/06 11:42:24
comment authorsteven.tjg
comment permlinkhow-to-use-volley-in-android-to-make-network-call
curatorsteven.tjg
reward6.136391 VESTS
Transaction InfoBlock #19631387/Virtual Operation #11
View Raw JSON Data
{
  "block": 19631387,
  "op": [
    "curation_reward",
    {
      "comment_author": "steven.tjg",
      "comment_permlink": "how-to-use-volley-in-android-to-make-network-call",
      "curator": "steven.tjg",
      "reward": "6.136391 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-06T11:42:24",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 11
}
steemdelegated 12.908 SP to @steven.tjg
2018/02/06 11:15:15
delegateesteven.tjg
delegatorsteem
vesting shares20994.875139 VESTS
Transaction InfoBlock #19630846/Trx f76ecf44419c93ddb207fa78acc8758e0a4de4e6
View Raw JSON Data
{
  "block": 19630846,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "steven.tjg",
      "delegator": "steem",
      "vesting_shares": "20994.875139 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-06T11:15:15",
  "trx_id": "f76ecf44419c93ddb207fa78acc8758e0a4de4e6",
  "trx_in_block": 21,
  "virtual_op": 0
}
steven.tjgclaimed reward balance: 7.664 SBD, 2.357 SP
2018/02/06 09:10:03
accountsteven.tjg
reward sbd7.664 SBD
reward steem0.000 STEEM
reward vests3833.259707 VESTS
Transaction InfoBlock #19628342/Trx 83a4a9dda0bbc17ab4df5fec90a454090cb7f2cb
View Raw JSON Data
{
  "block": 19628342,
  "op": [
    "claim_reward_balance",
    {
      "account": "steven.tjg",
      "reward_sbd": "7.664 SBD",
      "reward_steem": "0.000 STEEM",
      "reward_vests": "3833.259707 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-06T09:10:03",
  "trx_id": "83a4a9dda0bbc17ab4df5fec90a454090cb7f2cb",
  "trx_in_block": 16,
  "virtual_op": 0
}
steven.tjgreceived 7.664 SBD, 2.328 SP author reward for @steven.tjg / how-to-implement-seamless-otp-on-android
2018/02/06 04:24:15
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
sbd payout7.664 SBD
steem payout0.000 STEEM
vesting payout3786.212787 VESTS
Transaction InfoBlock #19622625/Virtual Operation #31
View Raw JSON Data
{
  "block": 19622625,
  "op": [
    "author_reward",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "sbd_payout": "7.664 SBD",
      "steem_payout": "0.000 STEEM",
      "vesting_payout": "3786.212787 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-06T04:24:15",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 31
}
utopian.payreceived 1.552 SP benefactor reward from @steven.tjg
2018/02/06 04:24:15
authorsteven.tjg
benefactorutopian.pay
permlinkhow-to-implement-seamless-otp-on-android
sbd payout0.000 SBD
steem payout0.000 STEEM
vesting payout2524.141858 VESTS
Transaction InfoBlock #19622625/Virtual Operation #30
View Raw JSON Data
{
  "block": 19622625,
  "op": [
    "comment_benefactor_reward",
    {
      "author": "steven.tjg",
      "benefactor": "utopian.pay",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "sbd_payout": "0.000 SBD",
      "steem_payout": "0.000 STEEM",
      "vesting_payout": "2524.141858 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-06T04:24:15",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 30
}
steven.tjgreceived 0.024 SP curation reward for @steven.tjg / how-to-implement-seamless-otp-on-android
2018/02/06 04:24:15
comment authorsteven.tjg
comment permlinkhow-to-implement-seamless-otp-on-android
curatorsteven.tjg
reward38.864420 VESTS
Transaction InfoBlock #19622625/Virtual Operation #19
View Raw JSON Data
{
  "block": 19622625,
  "op": [
    "curation_reward",
    {
      "comment_author": "steven.tjg",
      "comment_permlink": "how-to-implement-seamless-otp-on-android",
      "curator": "steven.tjg",
      "reward": "38.864420 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-06T04:24:15",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 19
}
steven.tjgreceived 0.001 SP curation reward for @murez-nst / mureztutorial008
2018/02/05 09:14:48
comment authormurez-nst
comment permlinkmureztutorial008
curatorsteven.tjg
reward2.045577 VESTS
Transaction InfoBlock #19599643/Virtual Operation #15
View Raw JSON Data
{
  "block": 19599643,
  "op": [
    "curation_reward",
    {
      "comment_author": "murez-nst",
      "comment_permlink": "mureztutorial008",
      "curator": "steven.tjg",
      "reward": "2.045577 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-05T09:14:48",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 15
}
2018/02/04 18:18:57
comment authorandrixyz
comment permlinkhow-to-display-pop-up-in-ios-development-using-sclalertview
curatorsteven.tjg
reward6.136923 VESTS
Transaction InfoBlock #19581735/Virtual Operation #7
View Raw JSON Data
{
  "block": 19581735,
  "op": [
    "curation_reward",
    {
      "comment_author": "andrixyz",
      "comment_permlink": "how-to-display-pop-up-in-ios-development-using-sclalertview",
      "curator": "steven.tjg",
      "reward": "6.136923 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-04T18:18:57",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 7
}
steven.tjgclaimed reward balance: 0.004 SP
2018/02/03 20:08:51
accountsteven.tjg
reward sbd0.000 SBD
reward steem0.000 STEEM
reward vests6.137742 VESTS
Transaction InfoBlock #19555218/Trx ec8b0d86808dd2ea9d3722cc0816a54aa695db2b
View Raw JSON Data
{
  "block": 19555218,
  "op": [
    "claim_reward_balance",
    {
      "account": "steven.tjg",
      "reward_sbd": "0.000 SBD",
      "reward_steem": "0.000 STEEM",
      "reward_vests": "6.137742 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-03T20:08:51",
  "trx_id": "ec8b0d86808dd2ea9d3722cc0816a54aa695db2b",
  "trx_in_block": 8,
  "virtual_op": 0
}
2018/02/02 02:06:39
comment authorandrixyz
comment permlinkworking-with-ezratingview-in-ios-apps-development
curatorsteven.tjg
reward6.137742 VESTS
Transaction InfoBlock #19504858/Virtual Operation #18
View Raw JSON Data
{
  "block": 19504858,
  "op": [
    "curation_reward",
    {
      "comment_author": "andrixyz",
      "comment_permlink": "working-with-ezratingview-in-ios-apps-development",
      "curator": "steven.tjg",
      "reward": "6.137742 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-02T02:06:39",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 18
}
2018/01/31 13:44:24
authorutopian-io
body### Hey @steven.tjg I am @utopian-io. I have just upvoted you! #### Achievements - You have less than 500 followers. Just gave you a gift to help you succeed! - Seems like you contribute quite often. AMAZING! #### Suggestions - Contribute more often to get higher and higher rewards. I wish to see you often! - Work on your followers to increase the votes/rewards. I follow what humans do and my vote is mainly based on that. Good luck! #### Get Noticed! - Did you know project owners can manually vote with their own voting power or by voting power delegated to their projects? Ask the project owner to review your contributions! #### Community-Driven Witness! I am the first and only Steem Community-Driven Witness. <a href="https://discord.gg/zTrEMqB">Participate on Discord</a>. Lets GROW TOGETHER! - <a href="https://v2.steemconnect.com/sign/account-witness-vote?witness=utopian-io&approve=1">Vote for my Witness With SteemConnect</a> - <a href="https://v2.steemconnect.com/sign/account-witness-proxy?proxy=utopian-io&approve=1">Proxy vote to Utopian Witness with SteemConnect</a> - Or vote/proxy on <a href="https://steemit.com/~witnesses">Steemit Witnesses</a> [![mooncryption-utopian-witness-gif](https://steemitimages.com/DQmYPUuQRptAqNBCQRwQjKWAqWU3zJkL3RXVUtEKVury8up/mooncryption-s-utopian-io-witness-gif.gif)](https://steemit.com/~witnesses) **Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x**
json metadata{"tags":["utopian-io"],"community":"utopian","app":"utopian/1.0.0"}
parent authorsteven.tjg
parent permlinkhow-to-implement-seamless-otp-on-android
permlinkre-steventjg-how-to-implement-seamless-otp-on-android-20180131t134424334z
title
Transaction InfoBlock #19461283/Trx 75709320aad342f0bd691db5a76b06d52d0a68ef
View Raw JSON Data
{
  "block": 19461283,
  "op": [
    "comment",
    {
      "author": "utopian-io",
      "body": "### Hey @steven.tjg I am @utopian-io. I have just upvoted you!\n#### Achievements\n- You have less than 500 followers. Just gave you a gift to help you succeed!\n- Seems like you contribute quite often. AMAZING!\n#### Suggestions\n- Contribute more often to get higher and higher rewards. I wish to see you often!\n- Work on your followers to increase the votes/rewards. I follow what humans do and my vote is mainly based on that. Good luck!\n#### Get Noticed!\n- Did you know project owners can manually vote with their own voting power or by voting power delegated to their projects? Ask the project owner to review your contributions!\n#### Community-Driven Witness!\nI am the first and only Steem Community-Driven Witness. <a href=\"https://discord.gg/zTrEMqB\">Participate on Discord</a>. Lets GROW TOGETHER!\n- <a href=\"https://v2.steemconnect.com/sign/account-witness-vote?witness=utopian-io&approve=1\">Vote for my Witness With SteemConnect</a>\n- <a href=\"https://v2.steemconnect.com/sign/account-witness-proxy?proxy=utopian-io&approve=1\">Proxy vote to Utopian Witness with SteemConnect</a>\n- Or vote/proxy on <a href=\"https://steemit.com/~witnesses\">Steemit Witnesses</a>\n\n[![mooncryption-utopian-witness-gif](https://steemitimages.com/DQmYPUuQRptAqNBCQRwQjKWAqWU3zJkL3RXVUtEKVury8up/mooncryption-s-utopian-io-witness-gif.gif)](https://steemit.com/~witnesses)\n\n**Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x**",
      "json_metadata": "{\"tags\":[\"utopian-io\"],\"community\":\"utopian\",\"app\":\"utopian/1.0.0\"}",
      "parent_author": "steven.tjg",
      "parent_permlink": "how-to-implement-seamless-otp-on-android",
      "permlink": "re-steventjg-how-to-implement-seamless-otp-on-android-20180131t134424334z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T13:44:24",
  "trx_id": "75709320aad342f0bd691db5a76b06d52d0a68ef",
  "trx_in_block": 45,
  "virtual_op": 0
}
2018/01/31 13:44:21
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
voterutopian-io
weight217 (2.17%)
Transaction InfoBlock #19461282/Trx 49d7a57cf14cf2047d675518f1c4f917319fa672
View Raw JSON Data
{
  "block": 19461282,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "utopian-io",
      "weight": 217
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T13:44:21",
  "trx_id": "49d7a57cf14cf2047d675518f1c4f917319fa672",
  "trx_in_block": 36,
  "virtual_op": 0
}
2018/01/31 13:15:57
authorutopian-io
body### Hey @steven.tjg I am @utopian-io. I have just upvoted you! #### Achievements - You have less than 500 followers. Just gave you a gift to help you succeed! - Seems like you contribute quite often. AMAZING! #### Suggestions - Contribute more often to get higher and higher rewards. I wish to see you often! - Work on your followers to increase the votes/rewards. I follow what humans do and my vote is mainly based on that. Good luck! #### Get Noticed! - Did you know project owners can manually vote with their own voting power or by voting power delegated to their projects? Ask the project owner to review your contributions! #### Community-Driven Witness! I am the first and only Steem Community-Driven Witness. <a href="https://discord.gg/zTrEMqB">Participate on Discord</a>. Lets GROW TOGETHER! - <a href="https://v2.steemconnect.com/sign/account-witness-vote?witness=utopian-io&approve=1">Vote for my Witness With SteemConnect</a> - <a href="https://v2.steemconnect.com/sign/account-witness-proxy?proxy=utopian-io&approve=1">Proxy vote to Utopian Witness with SteemConnect</a> - Or vote/proxy on <a href="https://steemit.com/~witnesses">Steemit Witnesses</a> [![mooncryption-utopian-witness-gif](https://steemitimages.com/DQmYPUuQRptAqNBCQRwQjKWAqWU3zJkL3RXVUtEKVury8up/mooncryption-s-utopian-io-witness-gif.gif)](https://steemit.com/~witnesses) **Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x**
json metadata{"tags":["utopian-io"],"community":"utopian","app":"utopian/1.0.0"}
parent authorsteven.tjg
parent permlinkhow-to-use-volley-in-android-to-make-network-call
permlinkre-steventjg-how-to-use-volley-in-android-to-make-network-call-20180131t131557438z
title
Transaction InfoBlock #19460714/Trx d42eb0d0e95720821d96befaf96b5334441984a2
View Raw JSON Data
{
  "block": 19460714,
  "op": [
    "comment",
    {
      "author": "utopian-io",
      "body": "### Hey @steven.tjg I am @utopian-io. I have just upvoted you!\n#### Achievements\n- You have less than 500 followers. Just gave you a gift to help you succeed!\n- Seems like you contribute quite often. AMAZING!\n#### Suggestions\n- Contribute more often to get higher and higher rewards. I wish to see you often!\n- Work on your followers to increase the votes/rewards. I follow what humans do and my vote is mainly based on that. Good luck!\n#### Get Noticed!\n- Did you know project owners can manually vote with their own voting power or by voting power delegated to their projects? Ask the project owner to review your contributions!\n#### Community-Driven Witness!\nI am the first and only Steem Community-Driven Witness. <a href=\"https://discord.gg/zTrEMqB\">Participate on Discord</a>. Lets GROW TOGETHER!\n- <a href=\"https://v2.steemconnect.com/sign/account-witness-vote?witness=utopian-io&approve=1\">Vote for my Witness With SteemConnect</a>\n- <a href=\"https://v2.steemconnect.com/sign/account-witness-proxy?proxy=utopian-io&approve=1\">Proxy vote to Utopian Witness with SteemConnect</a>\n- Or vote/proxy on <a href=\"https://steemit.com/~witnesses\">Steemit Witnesses</a>\n\n[![mooncryption-utopian-witness-gif](https://steemitimages.com/DQmYPUuQRptAqNBCQRwQjKWAqWU3zJkL3RXVUtEKVury8up/mooncryption-s-utopian-io-witness-gif.gif)](https://steemit.com/~witnesses)\n\n**Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x**",
      "json_metadata": "{\"tags\":[\"utopian-io\"],\"community\":\"utopian\",\"app\":\"utopian/1.0.0\"}",
      "parent_author": "steven.tjg",
      "parent_permlink": "how-to-use-volley-in-android-to-make-network-call",
      "permlink": "re-steventjg-how-to-use-volley-in-android-to-make-network-call-20180131t131557438z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T13:15:57",
  "trx_id": "d42eb0d0e95720821d96befaf96b5334441984a2",
  "trx_in_block": 28,
  "virtual_op": 0
}
2018/01/31 13:15:54
authorsteven.tjg
permlinkhow-to-use-volley-in-android-to-make-network-call
voterutopian-io
weight217 (2.17%)
Transaction InfoBlock #19460713/Trx 1cc0de52712616b4a5e821a7f49a31bedf3c6ac4
View Raw JSON Data
{
  "block": 19460713,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-use-volley-in-android-to-make-network-call",
      "voter": "utopian-io",
      "weight": 217
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T13:15:54",
  "trx_id": "1cc0de52712616b4a5e821a7f49a31bedf3c6ac4",
  "trx_in_block": 2,
  "virtual_op": 0
}
2018/01/31 12:38:24
authorsteven.tjg
permlinkhow-to-use-volley-in-android-to-make-network-call
votersteven.tjg
weight10000 (100.00%)
Transaction InfoBlock #19459964/Trx e4969db9576707ef871caf610140f0dbfe861d12
View Raw JSON Data
{
  "block": 19459964,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-use-volley-in-android-to-make-network-call",
      "voter": "steven.tjg",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T12:38:24",
  "trx_id": "e4969db9576707ef871caf610140f0dbfe861d12",
  "trx_in_block": 43,
  "virtual_op": 0
}
2018/01/31 09:52:15
authorsteven.tjg
permlinkhow-to-use-volley-in-android-to-make-network-call
votercifer
weight9000 (90.00%)
Transaction InfoBlock #19456644/Trx 482d9f7cca5ad6044b596f4b4cf69b3930a8f197
View Raw JSON Data
{
  "block": 19456644,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-use-volley-in-android-to-make-network-call",
      "voter": "cifer",
      "weight": 9000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T09:52:15",
  "trx_id": "482d9f7cca5ad6044b596f4b4cf69b3930a8f197",
  "trx_in_block": 22,
  "virtual_op": 0
}
2018/01/31 09:51:12
authorshreyasgune
bodyThank you for the contribution. It has been approved. You can contact us on [Discord](https://discord.gg/uTyJkNm). **[[utopian-moderator]](https://utopian.io/moderators)**
json metadata{"tags":["utopian-io"],"community":"utopian","app":"utopian/1.0.0"}
parent authorsteven.tjg
parent permlinkhow-to-use-volley-in-android-to-make-network-call
permlinkre-steventjg-how-to-use-volley-in-android-to-make-network-call-20180131t095051588z
title
Transaction InfoBlock #19456623/Trx b36b0f6050269bc5e9b64e6086c74bebbf431d37
View Raw JSON Data
{
  "block": 19456623,
  "op": [
    "comment",
    {
      "author": "shreyasgune",
      "body": "Thank you for the contribution. It has been approved.\n\nYou can contact us on [Discord](https://discord.gg/uTyJkNm).\n**[[utopian-moderator]](https://utopian.io/moderators)**",
      "json_metadata": "{\"tags\":[\"utopian-io\"],\"community\":\"utopian\",\"app\":\"utopian/1.0.0\"}",
      "parent_author": "steven.tjg",
      "parent_permlink": "how-to-use-volley-in-android-to-make-network-call",
      "permlink": "re-steventjg-how-to-use-volley-in-android-to-make-network-call-20180131t095051588z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T09:51:12",
  "trx_id": "b36b0f6050269bc5e9b64e6086c74bebbf431d37",
  "trx_in_block": 10,
  "virtual_op": 0
}
2018/01/31 09:48:00
authorsteven.tjg
body![image.jpg](https://res.cloudinary.com/hpiynhbhq/image/upload/v1517311899/jwqt9xxijwbr477ojy0v.jpg) Hi, in this tutorial I will show you how to use Volley to make a network call. #### What Will I Learn? - Implement Volley on an Android project. - Use Volley to make a network call. #### Requirements - Android Studio - Basic knowledge of Java #### Difficulty - Basic #### Overwiew Most of the time when you develop an Android apps, you will need to request data from or to a server. In Android, there is something called Async Task which you can use to request data from the network. But Async Task is kinda complicated to implement and work with. Luckily there are two popular third party library that can do the same but in a much simple way, and they are Volley and Retrofit. This tutorial will be focusing on Volley, though I do plan to make another tutorial with Retrofit in the future. #### Tutorial Contents **1. Add Volley Dependency in Gradle** To add volley dependency, you can simply add this code in the project build gradle file. ``` implementation 'com.android.volley:volley:1.1.0' ``` This is my whole ```build.gradle``` file: ``` apply plugin: 'com.android.application' android { compileSdkVersion 27 buildToolsVersion '27.0.3' defaultConfig { applicationId "com.steven.example.volleyexample" minSdkVersion 21 targetSdkVersion 27 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:27.0.2' implementation 'com.android.support:design:27.0.2' implementation 'com.android.support:recyclerview-v7:27.0.2' implementation 'com.android.volley:volley:1.1.0' implementation 'com.squareup.picasso:picasso:2.5.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' } ``` **2. Add Permission to connect to the internet** Now, in order to make a network call, the application need access or in Android it is called permission to connect to the internet. To do that simply add this line of code in your ```AndroidManifest.xml```. ``` <uses-permission android:name="android.permission.INTERNET" /> ``` And this is the code in my ```AndroidManifest.xml```. ``` <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.steven.example.volleyexample"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:fullBackupContent="false" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MemberActivity" /> </application> </manifest> ``` **3. Create Volley Singleton** Now lets create a singleton class, so each time when you need to request to a network, you simply call this singleton class. This is my ```VolleySingleton.java``` class code: ``` public class VolleySingleton { private static VolleySingleton mInstance; private static Context mContext; private RequestQueue mRequestQueue; private ImageLoader mImageLoader; private VolleySingleton(Context context) { mContext = context; mRequestQueue = getRequestQueue(); mImageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() { private final LruCache<String, Bitmap> cache = new LruCache<>(20); @Override public Bitmap getBitmap(String url) { return cache.get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { cache.put(url, bitmap); } }); } public static synchronized VolleySingleton getInstance(Context context) { if (mInstance == null) { mInstance = new VolleySingleton(context); } return mInstance; } public RequestQueue getRequestQueue() { if (mRequestQueue == null) { mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext()); } return mRequestQueue; } public <T> void addToRequestQueue(Request<T> request, String tag) { request.setTag(tag); getRequestQueue().add(request); } public void cancelRequest(String tag) { if (mRequestQueue != null) { mRequestQueue.cancelAll(tag); } } public ImageLoader getImageLoader() { return mImageLoader; } } ``` **4. Create Data Model** Okay, in this tutorial I will make a network call that request data from https://api.github.com/users. That API will return example data of Github user. So create a class for the data model and create getter and setter for each field. ``` public class DataModel { private String login; private int id; private String avatar_url; private String gravatar_id; private String url; private String html_url; private String followers_url; private String following_url; private String gists_url; private String starred_url; private String subscriptions_url; private String organizations_url; private String repos_url; private String events_url; private String recieved_events_url; private String type; private boolean site_admin; public DataModel(String login, int id, String avatar_url, String gravatar_id, String url, String html_url, String followers_url, String following_url, String gists_url, String starred_url, String subscriptions_url, String organizations_url, String repos_url, String events_url, String received_events_url, String type, boolean site_admin) { this.login = login; this.id = id; this.avatar_url = avatar_url; this.gravatar_id = gravatar_id; this.url = url; this.html_url = html_url; this.followers_url = followers_url; this.following_url = following_url; this.gists_url = gists_url; this.starred_url = starred_url; this.subscriptions_url = subscriptions_url; this.organizations_url = organizations_url; this.repos_url = repos_url; this.events_url = events_url; this.recieved_events_url = received_events_url; this.type = type; this.site_admin = site_admin; } public String getLogin() { return login; } public void setLogin(String login) { this.login = login; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAvatar_url() { return avatar_url; } public void setAvatar_url(String avatar_url) { this.avatar_url = avatar_url; } public String getGravatar_id() { return gravatar_id; } public void setGravatar_id(String gravatar_id) { this.gravatar_id = gravatar_id; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getHtml_url() { return html_url; } public void setHtml_url(String html_url) { this.html_url = html_url; } public String getFollowers_url() { return followers_url; } public void setFollowers_url(String followers_url) { this.followers_url = followers_url; } public String getFollowing_url() { return following_url; } public void setFollowing_url(String following_url) { this.following_url = following_url; } public String getGists_url() { return gists_url; } public void setGists_url(String gists_url) { this.gists_url = gists_url; } public String getStarred_url() { return starred_url; } public void setStarred_url(String starred_url) { this.starred_url = starred_url; } public String getSubscriptions_url() { return subscriptions_url; } public void setSubscriptions_url(String subscriptions_url) { this.subscriptions_url = subscriptions_url; } public String getOrganizations_url() { return organizations_url; } public void setOrganizations_url(String organizations_url) { this.organizations_url = organizations_url; } public String getRepos_url() { return repos_url; } public void setRepos_url(String repos_url) { this.repos_url = repos_url; } public String getEvents_url() { return events_url; } public void setEvents_url(String events_url) { this.events_url = events_url; } public String getRecieved_events_url() { return recieved_events_url; } public void setRecieved_events_url(String recieved_events_url) { this.recieved_events_url = recieved_events_url; } public String getType() { return type; } public void setType(String type) { this.type = type; } public boolean isSite_admin() { return site_admin; } public void setSite_admin(boolean site_admin) { this.site_admin = site_admin; } ``` **5. Make Network Call** Now its time to make a network call. Since the data we get from API is an array of object, we will use JsonArrayRequest. If the data returned is an object, then you can use JsonObjectRequest. In the example code below. After the request is successful, we need to loop and insert each field of the object into an List, then we can pass the List into a RecyclerViewAdapter and show the result in a RecyclerView. After creating a request, add it to the queue by calling VolleySingleton instance. ``` JsonArrayRequest request = new JsonArrayRequest(Request.Method.GET, REQUEST_URL, null, response -> { List<DataModel> data = new ArrayList<>(); for (int i = 0; i < response.length(); i++) { try { JSONObject object = response.getJSONObject(i); DataModel model = new DataModel(object.getString("login"), object.getInt("id"), object.getString("avatar_url"), object.getString("gravatar_id"), object.getString("url"), object.getString("html_url"), object.getString("followers_url"), object.getString("following_url"), object.getString("gists_url"), object.getString("starred_url"), object.getString("subscriptions_url"), object.getString("organizations_url"), object.getString("repos_url"), object.getString("events_url"), object.getString("received_events_url"), object.getString("type"), object.getBoolean("site_admin")); data.add(model); } catch (Exception e) { Log.d(TAG, e.toString()); } finally { mAdapter.clearItems(); mAdapter.addItems(data); mAdapter.notifyDataSetChanged(); } } }, error -> { Log.d(TAG, error.toString()); }); VolleySingleton.getInstance(this.getApplicationContext()).addToRequestQueue(request, NETWORK_CALL); ``` **6. Display Data in Recycler View** Now it is time to show data from the API in a RecyclerView. First we need to create a layout for the recycler view holder. In this example I name it ```item_user.xml``` with the following code: ``` <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.AppCompatImageView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/user_avatar" android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="centerCrop" /> ``` The next step is to bind ```item_user.xml``` to an adapter by overriding the onCreateViewHolder method. Then set the data that we get from API to RecyclerView in the onBindView method. The example code below is an RecyclerViewAdapter. ``` public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context mContext; private List<DataModel> mUserData = new ArrayList<>(); RecyclerViewAdapter(Context context) { mContext = context; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new UserDataViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_user, parent, false)); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { UserDataViewHolder userDataViewHolder = (UserDataViewHolder) holder; VolleySingleton.getInstance(mContext).getImageLoader().get(mUserData.get(position).getAvatar_url(), new ImageLoader.ImageListener() { @Override public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { userDataViewHolder.mUserAvatar.setImageBitmap(response.getBitmap()); } @Override public void onErrorResponse(VolleyError error) { } }); userDataViewHolder.mUserAvatar.setOnClickListener(v -> mContext.startActivity(new Intent(mContext, MemberActivity.class). putExtra(MemberActivity.ARG_LOGIN, mUserData.get(position).getLogin()). putExtra(MemberActivity.ARG_ID, mUserData.get(position).getId()). putExtra(MemberActivity.ARG_AVATAR_URL, mUserData.get(position).getAvatar_url()). putExtra(MemberActivity.ARG_GRAVATAR_ID, mUserData.get(position).getGravatar_id()). putExtra(MemberActivity.ARG_URL, mUserData.get(position).getUrl()). putExtra(MemberActivity.ARG_HTML_URL, mUserData.get(position).getHtml_url()). putExtra(MemberActivity.ARG_FOLLOWERS_URL, mUserData.get(position).getFollowers_url()). putExtra(MemberActivity.ARG_FOLLOWING_URL, mUserData.get(position).getFollowing_url()). putExtra(MemberActivity.ARG_GISTS_URL, mUserData.get(position).getGists_url()). putExtra(MemberActivity.ARG_STARRED_URL, mUserData.get(position).getStarred_url()). putExtra(MemberActivity.ARG_SUBSCRIPTIONS_URL, mUserData.get(position).getSubscriptions_url()). putExtra(MemberActivity.ARG_ORGANIZATIONS_URL, mUserData.get(position).getOrganizations_url()). putExtra(MemberActivity.ARG_REPOS_URL, mUserData.get(position).getRepos_url()). putExtra(MemberActivity.ARG_EVENTS_URL, mUserData.get(position).getEvents_url()). putExtra(MemberActivity.ARG_RECIEVED_EVENTS_URL, mUserData.get(position).getRecieved_events_url()). putExtra(MemberActivity.ARG_TYPE, mUserData.get(position).getType()). putExtra(MemberActivity.ARG_SITE_ADMIN, mUserData.get(position).isSite_admin()))); } @Override public int getItemCount() { return mUserData.size(); } public void addItems(List<DataModel> data) { mUserData.addAll(data); } public void clearItems() { mUserData.clear(); } public class UserDataViewHolder extends RecyclerView.ViewHolder { private AppCompatImageView mUserAvatar; UserDataViewHolder(View itemView) { super(itemView); mUserAvatar = itemView.findViewById(R.id.user_avatar); } } } ``` The result will look like this: ![image.jpg](https://res.cloudinary.com/hpiynhbhq/image/upload/v1517311899/jwqt9xxijwbr477ojy0v.jpg) For further usage, you can check out volley repository here: https://github.com/google/volley. You can also check out the example project I made in this tutorial here: https://github.com/steven-tjg/volley-example. <br /><hr/><em>Posted on <a href="https://utopian.io/utopian-io/@steven.tjg/how-to-use-volley-in-android-to-make-network-call">Utopian.io - Rewarding Open Source Contributors</a></em><hr/>
json metadata{"community":"utopian","app":"utopian/1.0.0","format":"markdown","repository":{"id":79936381,"name":"volley","full_name":"google/volley","html_url":"https://github.com/google/volley","fork":false,"owner":{"login":"google"}},"pullRequests":[],"platform":"github","type":"tutorials","tags":["utopian-io","android","tutorial","volley","network"],"users":["mipmap","string","style","Override"],"links":["https://res.cloudinary.com/hpiynhbhq/image/upload/v1517311899/jwqt9xxijwbr477ojy0v.jpg"],"image":["https://res.cloudinary.com/hpiynhbhq/image/upload/v1517311899/jwqt9xxijwbr477ojy0v.jpg"],"moderator":{"account":"shreyasgune","time":"2018-01-31T09:48:00.992Z","reviewed":true,"pending":false,"flagged":false}}
parent author
parent permlinkutopian-io
permlinkhow-to-use-volley-in-android-to-make-network-call
titleHow to Use Volley in Android to Make Network Call
Transaction InfoBlock #19456559/Trx 08301ee8c1826f32ce727795cbbc78fdc191e175
View Raw JSON Data
{
  "block": 19456559,
  "op": [
    "comment",
    {
      "author": "steven.tjg",
      "body": "![image.jpg](https://res.cloudinary.com/hpiynhbhq/image/upload/v1517311899/jwqt9xxijwbr477ojy0v.jpg)\n\nHi, in this tutorial I will show you how to use Volley to make a network call.\n\n#### What Will I Learn?\n- Implement Volley on an Android project.\n- Use Volley to make a network call.\n\n#### Requirements\n- Android Studio\n- Basic knowledge of Java\n\n#### Difficulty\n- Basic\n\n#### Overwiew\nMost of the time when you develop an Android apps, you will need to request data from or to a server. In Android, there is something called Async Task which you can use to request data from the network. But Async Task is kinda complicated to implement and work with. Luckily there are two popular third party library that can do the same but in a much simple way, and they are Volley and Retrofit. This tutorial will be focusing on Volley, though I do plan to make another tutorial with Retrofit in the future.\n\n#### Tutorial Contents\n**1. Add Volley Dependency in Gradle**\nTo add volley dependency, you can simply add this code in the project build gradle file.\n```\nimplementation 'com.android.volley:volley:1.1.0'\n```\nThis is my whole ```build.gradle``` file:\n```\napply plugin: 'com.android.application'\nandroid {\n    compileSdkVersion 27\n    buildToolsVersion '27.0.3'\n    defaultConfig {\n        applicationId \"com.steven.example.volleyexample\"\n        minSdkVersion 21\n        targetSdkVersion 27\n        versionCode 1\n        versionName \"1.0\"\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n}\ndependencies {\n    implementation fileTree(include: ['*.jar'], dir: 'libs')\n    implementation 'com.android.support:appcompat-v7:27.0.2'\n    implementation 'com.android.support:design:27.0.2'\n    implementation 'com.android.support:recyclerview-v7:27.0.2'\n    implementation 'com.android.volley:volley:1.1.0'\n    implementation 'com.squareup.picasso:picasso:2.5.2'\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'com.android.support.test:runner:1.0.1'\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'\n}\n\n```\n\n**2. Add Permission to connect to the internet**\nNow, in order to make a network call, the application need access or in Android it is called permission to connect to the internet. To do that simply add this line of code in your ```AndroidManifest.xml```.\n```\n<uses-permission android:name=\"android.permission.INTERNET\" />\n```\nAnd this is the code in my ```AndroidManifest.xml```.\n```\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.steven.example.volleyexample\">\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <application\n        android:allowBackup=\"true\"\n        android:fullBackupContent=\"false\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n        <activity android:name=\".MainActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n                <action android:name=\"android.intent.action.VIEW\" />\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n        <activity android:name=\".MemberActivity\" />\n    </application>\n</manifest>\n```\n\n**3. Create Volley Singleton**\nNow lets create a singleton class, so each time when you need to request to a network, you simply call this singleton class.\n\nThis is my ```VolleySingleton.java``` class code:\n\n```\npublic class VolleySingleton {\n    private static VolleySingleton mInstance;\n    private static Context mContext;\n    private RequestQueue mRequestQueue;\n    private ImageLoader mImageLoader;\n    private VolleySingleton(Context context) {\n        mContext = context;\n        mRequestQueue = getRequestQueue();\n        mImageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {\n            private final LruCache<String, Bitmap> cache = new LruCache<>(20);\n            @Override\n            public Bitmap getBitmap(String url) {\n                return cache.get(url);\n            }\n            @Override\n            public void putBitmap(String url, Bitmap bitmap) {\n                cache.put(url, bitmap);\n            }\n        });\n    }\n    public static synchronized VolleySingleton getInstance(Context context) {\n        if (mInstance == null) {\n            mInstance = new VolleySingleton(context);\n        }\n        return mInstance;\n    }\n    public RequestQueue getRequestQueue() {\n        if (mRequestQueue == null) {\n            mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext());\n        }\n        return mRequestQueue;\n    }\n    public <T> void addToRequestQueue(Request<T> request, String tag) {\n        request.setTag(tag);\n        getRequestQueue().add(request);\n    }\n    public void cancelRequest(String tag) {\n        if (mRequestQueue != null) {\n            mRequestQueue.cancelAll(tag);\n        }\n    }\n    public ImageLoader getImageLoader() {\n        return mImageLoader;\n    }\n}\n```\n\n**4. Create Data Model**\nOkay, in this tutorial I will make a network call that request data from https://api.github.com/users. That API will return example data of Github user. So create a class for the data model and create getter and setter for each field.\n```\npublic class DataModel {\n    private String login;\n    private int id;\n    private String avatar_url;\n    private String gravatar_id;\n    private String url;\n    private String html_url;\n    private String followers_url;\n    private String following_url;\n    private String gists_url;\n    private String starred_url;\n    private String subscriptions_url;\n    private String organizations_url;\n    private String repos_url;\n    private String events_url;\n    private String recieved_events_url;\n    private String type;\n    private boolean site_admin;\n\n    public DataModel(String login, int id, String avatar_url, String gravatar_id, String url, String html_url,\n                     String followers_url, String following_url, String gists_url, String starred_url, String subscriptions_url,\n                     String organizations_url, String repos_url, String events_url, String received_events_url, String type, boolean site_admin) {\n        this.login = login;\n        this.id = id;\n        this.avatar_url = avatar_url;\n        this.gravatar_id = gravatar_id;\n        this.url = url;\n        this.html_url = html_url;\n        this.followers_url = followers_url;\n        this.following_url = following_url;\n        this.gists_url = gists_url;\n        this.starred_url = starred_url;\n        this.subscriptions_url = subscriptions_url;\n        this.organizations_url = organizations_url;\n        this.repos_url = repos_url;\n        this.events_url = events_url;\n        this.recieved_events_url = received_events_url;\n        this.type = type;\n        this.site_admin = site_admin;\n    }\n    public String getLogin() {\n        return login;\n    }\n    public void setLogin(String login) {\n        this.login = login;\n    }\n    public int getId() {\n        return id;\n    }\n    public void setId(int id) {\n        this.id = id;\n    }\n    public String getAvatar_url() {\n        return avatar_url;\n    }\n    public void setAvatar_url(String avatar_url) {\n        this.avatar_url = avatar_url;\n    }\n    public String getGravatar_id() {\n        return gravatar_id;\n    }\n    public void setGravatar_id(String gravatar_id) {\n        this.gravatar_id = gravatar_id;\n    }\n    public String getUrl() {\n        return url;\n    }\n    public void setUrl(String url) {\n        this.url = url;\n    }\n    public String getHtml_url() {\n        return html_url;\n    }\n    public void setHtml_url(String html_url) {\n        this.html_url = html_url;\n    }\n    public String getFollowers_url() {\n        return followers_url;\n    }\n    public void setFollowers_url(String followers_url) {\n        this.followers_url = followers_url;\n    }\n    public String getFollowing_url() {\n        return following_url;\n    }\n    public void setFollowing_url(String following_url) {\n        this.following_url = following_url;\n    }\n    public String getGists_url() {\n        return gists_url;\n    }\n    public void setGists_url(String gists_url) {\n        this.gists_url = gists_url;\n    }\n    public String getStarred_url() {\n        return starred_url;\n    }\n    public void setStarred_url(String starred_url) {\n        this.starred_url = starred_url;\n    }\n    public String getSubscriptions_url() {\n        return subscriptions_url;\n    }\n    public void setSubscriptions_url(String subscriptions_url) {\n        this.subscriptions_url = subscriptions_url;\n    }\n    public String getOrganizations_url() {\n        return organizations_url;\n    }\n    public void setOrganizations_url(String organizations_url) {\n        this.organizations_url = organizations_url;\n    }\n    public String getRepos_url() {\n        return repos_url;\n    }\n    public void setRepos_url(String repos_url) {\n        this.repos_url = repos_url;\n    }\n    public String getEvents_url() {\n        return events_url;\n    }\n    public void setEvents_url(String events_url) {\n        this.events_url = events_url;\n    }\n    public String getRecieved_events_url() {\n        return recieved_events_url;\n    }\n    public void setRecieved_events_url(String recieved_events_url) {\n        this.recieved_events_url = recieved_events_url;\n    }\n    public String getType() {\n        return type;\n    }\n    public void setType(String type) {\n        this.type = type;\n    }\n    public boolean isSite_admin() {\n        return site_admin;\n    }\n    public void setSite_admin(boolean site_admin) {\n        this.site_admin = site_admin;\n    }\n``` \n\n**5. Make Network Call**\nNow its time to make a network call. Since the data we get from API is an array of object, we will use JsonArrayRequest. If the data returned is an object, then you can use JsonObjectRequest. In the example code below. After the request is successful, we need to loop and insert each field of the object into an List, then we can pass the List into a RecyclerViewAdapter and show the result in a RecyclerView. After creating a request, add it to the queue by calling VolleySingleton instance.\n\n```\nJsonArrayRequest request = new JsonArrayRequest(Request.Method.GET, REQUEST_URL, null, response -> {\n            List<DataModel> data = new ArrayList<>();\n            for (int i = 0; i < response.length(); i++) {\n                try {\n                    JSONObject object = response.getJSONObject(i);\n                    DataModel model = new DataModel(object.getString(\"login\"),\n                            object.getInt(\"id\"), object.getString(\"avatar_url\"),\n                            object.getString(\"gravatar_id\"), object.getString(\"url\"),\n                            object.getString(\"html_url\"), object.getString(\"followers_url\"),\n                            object.getString(\"following_url\"), object.getString(\"gists_url\"),\n                            object.getString(\"starred_url\"), object.getString(\"subscriptions_url\"),\n                            object.getString(\"organizations_url\"), object.getString(\"repos_url\"),\n                            object.getString(\"events_url\"), object.getString(\"received_events_url\"),\n                            object.getString(\"type\"), object.getBoolean(\"site_admin\"));\n                    data.add(model);\n                } catch (Exception e) {\n                    Log.d(TAG, e.toString());\n                } finally {\n                    mAdapter.clearItems();\n                    mAdapter.addItems(data);\n                    mAdapter.notifyDataSetChanged();\n                }\n            }\n        }, error -> {\n            Log.d(TAG, error.toString());\n });\nVolleySingleton.getInstance(this.getApplicationContext()).addToRequestQueue(request, NETWORK_CALL);\n```\n\n**6. Display Data in Recycler View**\nNow it is time to show data from the API in a RecyclerView. First we need to create a layout for the recycler view holder. In this example I name it ```item_user.xml``` with the following code:\n```\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.AppCompatImageView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/user_avatar\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:scaleType=\"centerCrop\" />\n```\nThe next step is to bind ```item_user.xml``` to an adapter by overriding the onCreateViewHolder method. Then set the data that we get from API to RecyclerView in the onBindView method. The example code below is an RecyclerViewAdapter.\n```\npublic class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {\n    private Context mContext;\n    private List<DataModel> mUserData = new ArrayList<>();\n    RecyclerViewAdapter(Context context) {\n        mContext = context;\n    }\n    @Override\n    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        return new UserDataViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_user, parent, false));\n    }\n    @Override\n    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {\n        UserDataViewHolder userDataViewHolder = (UserDataViewHolder) holder;   VolleySingleton.getInstance(mContext).getImageLoader().get(mUserData.get(position).getAvatar_url(), new ImageLoader.ImageListener() {\n            @Override\n            public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {\n                userDataViewHolder.mUserAvatar.setImageBitmap(response.getBitmap());\n            }\n            @Override\n            public void onErrorResponse(VolleyError error) {\n            }\n        });\n        userDataViewHolder.mUserAvatar.setOnClickListener(v -> mContext.startActivity(new Intent(mContext, MemberActivity.class).\n                putExtra(MemberActivity.ARG_LOGIN, mUserData.get(position).getLogin()).\n                putExtra(MemberActivity.ARG_ID, mUserData.get(position).getId()).\n                putExtra(MemberActivity.ARG_AVATAR_URL, mUserData.get(position).getAvatar_url()).\n                putExtra(MemberActivity.ARG_GRAVATAR_ID, mUserData.get(position).getGravatar_id()).\n                putExtra(MemberActivity.ARG_URL, mUserData.get(position).getUrl()).\n                putExtra(MemberActivity.ARG_HTML_URL, mUserData.get(position).getHtml_url()).\n                putExtra(MemberActivity.ARG_FOLLOWERS_URL, mUserData.get(position).getFollowers_url()).\n                putExtra(MemberActivity.ARG_FOLLOWING_URL, mUserData.get(position).getFollowing_url()).\n                putExtra(MemberActivity.ARG_GISTS_URL, mUserData.get(position).getGists_url()).\n                putExtra(MemberActivity.ARG_STARRED_URL, mUserData.get(position).getStarred_url()).\n                putExtra(MemberActivity.ARG_SUBSCRIPTIONS_URL, mUserData.get(position).getSubscriptions_url()).\n                putExtra(MemberActivity.ARG_ORGANIZATIONS_URL, mUserData.get(position).getOrganizations_url()).\n                putExtra(MemberActivity.ARG_REPOS_URL, mUserData.get(position).getRepos_url()).\n                putExtra(MemberActivity.ARG_EVENTS_URL, mUserData.get(position).getEvents_url()).\n                putExtra(MemberActivity.ARG_RECIEVED_EVENTS_URL, mUserData.get(position).getRecieved_events_url()).\n                putExtra(MemberActivity.ARG_TYPE, mUserData.get(position).getType()).\n                putExtra(MemberActivity.ARG_SITE_ADMIN, mUserData.get(position).isSite_admin())));\n    }\n    @Override\n    public int getItemCount() {\n        return mUserData.size();\n    }\n    public void addItems(List<DataModel> data) {\n        mUserData.addAll(data);\n    }\n    public void clearItems() {\n        mUserData.clear();\n    }\n    public class UserDataViewHolder extends RecyclerView.ViewHolder {\n        private AppCompatImageView mUserAvatar;\n        UserDataViewHolder(View itemView) {\n            super(itemView);\n            mUserAvatar = itemView.findViewById(R.id.user_avatar);\n        }\n    }\n}\n```\n\nThe result will look like this:\n![image.jpg](https://res.cloudinary.com/hpiynhbhq/image/upload/v1517311899/jwqt9xxijwbr477ojy0v.jpg)\n\nFor further usage, you can check out volley repository here: https://github.com/google/volley.\nYou can also check out the example project I made in this tutorial here: https://github.com/steven-tjg/volley-example.\n\n\n<br /><hr/><em>Posted on <a href=\"https://utopian.io/utopian-io/@steven.tjg/how-to-use-volley-in-android-to-make-network-call\">Utopian.io -  Rewarding Open Source Contributors</a></em><hr/>",
      "json_metadata": "{\"community\":\"utopian\",\"app\":\"utopian/1.0.0\",\"format\":\"markdown\",\"repository\":{\"id\":79936381,\"name\":\"volley\",\"full_name\":\"google/volley\",\"html_url\":\"https://github.com/google/volley\",\"fork\":false,\"owner\":{\"login\":\"google\"}},\"pullRequests\":[],\"platform\":\"github\",\"type\":\"tutorials\",\"tags\":[\"utopian-io\",\"android\",\"tutorial\",\"volley\",\"network\"],\"users\":[\"mipmap\",\"string\",\"style\",\"Override\"],\"links\":[\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1517311899/jwqt9xxijwbr477ojy0v.jpg\"],\"image\":[\"https://res.cloudinary.com/hpiynhbhq/image/upload/v1517311899/jwqt9xxijwbr477ojy0v.jpg\"],\"moderator\":{\"account\":\"shreyasgune\",\"time\":\"2018-01-31T09:48:00.992Z\",\"reviewed\":true,\"pending\":false,\"flagged\":false}}",
      "parent_author": "",
      "parent_permlink": "utopian-io",
      "permlink": "how-to-use-volley-in-android-to-make-network-call",
      "title": "How to Use Volley in Android to Make Network Call"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T09:48:00",
  "trx_id": "08301ee8c1826f32ce727795cbbc78fdc191e175",
  "trx_in_block": 25,
  "virtual_op": 0
}
2018/01/31 02:25:51
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
votercalmunicorn
weight10000 (100.00%)
Transaction InfoBlock #19447721/Trx f0784597b2cae6fee8402782f802db125e2ad44c
View Raw JSON Data
{
  "block": 19447721,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "calmunicorn",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T02:25:51",
  "trx_id": "f0784597b2cae6fee8402782f802db125e2ad44c",
  "trx_in_block": 12,
  "virtual_op": 0
}
2018/01/31 02:25:33
authorsteven.tjg
permlinkhow-to-use-volley-in-android-to-make-network-call
votercalmunicorn
weight10000 (100.00%)
Transaction InfoBlock #19447715/Trx 41cdf73202f850c8cd2bdd38c900350b2850a7ee
View Raw JSON Data
{
  "block": 19447715,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-use-volley-in-android-to-make-network-call",
      "voter": "calmunicorn",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T02:25:33",
  "trx_id": "41cdf73202f850c8cd2bdd38c900350b2850a7ee",
  "trx_in_block": 17,
  "virtual_op": 0
}
2018/01/31 02:13:39
authorsteven.tjg
permlinkhow-to-use-volley-in-android-to-make-network-call
votermurez-nst
weight10000 (100.00%)
Transaction InfoBlock #19447478/Trx a9e56240651c8c7ef585dd598a24a30907d6fe33
View Raw JSON Data
{
  "block": 19447478,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-use-volley-in-android-to-make-network-call",
      "voter": "murez-nst",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T02:13:39",
  "trx_id": "a9e56240651c8c7ef585dd598a24a30907d6fe33",
  "trx_in_block": 16,
  "virtual_op": 0
}
steven.tjgclaimed reward balance: 0.003 SP
2018/01/31 01:54:00
accountsteven.tjg
reward sbd0.000 SBD
reward steem0.000 STEEM
reward vests4.092392 VESTS
Transaction InfoBlock #19447086/Trx fd1f08d318e1eacaf636f59daeb95f4590d67a01
View Raw JSON Data
{
  "block": 19447086,
  "op": [
    "claim_reward_balance",
    {
      "account": "steven.tjg",
      "reward_sbd": "0.000 SBD",
      "reward_steem": "0.000 STEEM",
      "reward_vests": "4.092392 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T01:54:00",
  "trx_id": "fd1f08d318e1eacaf636f59daeb95f4590d67a01",
  "trx_in_block": 3,
  "virtual_op": 0
}
2018/01/31 01:13:48
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
votermonster-reborn
weight10000 (100.00%)
Transaction InfoBlock #19446282/Trx b250b03512ea625d309695da0e137d5937eb34ca
View Raw JSON Data
{
  "block": 19446282,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "monster-reborn",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T01:13:48",
  "trx_id": "b250b03512ea625d309695da0e137d5937eb34ca",
  "trx_in_block": 19,
  "virtual_op": 0
}
2018/01/31 01:13:48
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
voterlilith
weight10000 (100.00%)
Transaction InfoBlock #19446282/Trx 9f4561a063b514999e393b9b6fcab3570829a028
View Raw JSON Data
{
  "block": 19446282,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "lilith",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T01:13:48",
  "trx_id": "9f4561a063b514999e393b9b6fcab3570829a028",
  "trx_in_block": 18,
  "virtual_op": 0
}
2018/01/31 01:13:48
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
voterthegrandestine
weight10000 (100.00%)
Transaction InfoBlock #19446282/Trx 98791133c3fce500acce6a5498207bc58f2cb6e8
View Raw JSON Data
{
  "block": 19446282,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "thegrandestine",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T01:13:48",
  "trx_id": "98791133c3fce500acce6a5498207bc58f2cb6e8",
  "trx_in_block": 17,
  "virtual_op": 0
}
2018/01/31 01:13:48
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
voterretrocausality
weight10000 (100.00%)
Transaction InfoBlock #19446282/Trx 602640e1eae6818f45728d57f5a6d95c1dfea57f
View Raw JSON Data
{
  "block": 19446282,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "retrocausality",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T01:13:48",
  "trx_id": "602640e1eae6818f45728d57f5a6d95c1dfea57f",
  "trx_in_block": 16,
  "virtual_op": 0
}
2018/01/31 01:13:48
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
voteraudiosiren
weight10000 (100.00%)
Transaction InfoBlock #19446282/Trx 361d8bfaa81fe52137992d8f90aeec038f9134df
View Raw JSON Data
{
  "block": 19446282,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "audiosiren",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T01:13:48",
  "trx_id": "361d8bfaa81fe52137992d8f90aeec038f9134df",
  "trx_in_block": 15,
  "virtual_op": 0
}
2018/01/31 01:13:48
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
voterthe-reaper
weight10000 (100.00%)
Transaction InfoBlock #19446282/Trx 359c77e1a18cc51f3088cdd202cbf3f68a965d2b
View Raw JSON Data
{
  "block": 19446282,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "the-reaper",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T01:13:48",
  "trx_id": "359c77e1a18cc51f3088cdd202cbf3f68a965d2b",
  "trx_in_block": 14,
  "virtual_op": 0
}
2018/01/31 01:12:33
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
voterparadoxofchoice
weight10000 (100.00%)
Transaction InfoBlock #19446257/Trx 3c66146785baec1b011aa65ccfc25365bf70efa5
View Raw JSON Data
{
  "block": 19446257,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "paradoxofchoice",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T01:12:33",
  "trx_id": "3c66146785baec1b011aa65ccfc25365bf70efa5",
  "trx_in_block": 37,
  "virtual_op": 0
}
2018/01/31 01:12:33
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
voterlove-me
weight10000 (100.00%)
Transaction InfoBlock #19446257/Trx aae43b94c5bf17b0ec4d1b54dacf11f8b4e8d0d7
View Raw JSON Data
{
  "block": 19446257,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "love-me",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T01:12:33",
  "trx_id": "aae43b94c5bf17b0ec4d1b54dacf11f8b4e8d0d7",
  "trx_in_block": 36,
  "virtual_op": 0
}
2018/01/31 01:12:33
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
votermysticalword
weight10000 (100.00%)
Transaction InfoBlock #19446257/Trx 8d1a32d5bb9634c1c3a6b28aac7d0b25cbb2ca9c
View Raw JSON Data
{
  "block": 19446257,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "mysticalword",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T01:12:33",
  "trx_id": "8d1a32d5bb9634c1c3a6b28aac7d0b25cbb2ca9c",
  "trx_in_block": 35,
  "virtual_op": 0
}
2018/01/31 01:12:33
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
votermirrorforce
weight10000 (100.00%)
Transaction InfoBlock #19446257/Trx ae5afc8e51c764f3a504a9fa6bce44bda0233495
View Raw JSON Data
{
  "block": 19446257,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "mirrorforce",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T01:12:33",
  "trx_id": "ae5afc8e51c764f3a504a9fa6bce44bda0233495",
  "trx_in_block": 34,
  "virtual_op": 0
}
2018/01/31 01:12:33
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
voteromegacore
weight10000 (100.00%)
Transaction InfoBlock #19446257/Trx 8dc34eb15315de8892f991016a7bb92161dc7e9a
View Raw JSON Data
{
  "block": 19446257,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "omegacore",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T01:12:33",
  "trx_id": "8dc34eb15315de8892f991016a7bb92161dc7e9a",
  "trx_in_block": 33,
  "virtual_op": 0
}
2018/01/31 01:12:33
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
voterchaostheory
weight10000 (100.00%)
Transaction InfoBlock #19446257/Trx cb5f8f04b82bc72fdb602b087cd543bd5ca84c5d
View Raw JSON Data
{
  "block": 19446257,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "chaostheory",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T01:12:33",
  "trx_id": "cb5f8f04b82bc72fdb602b087cd543bd5ca84c5d",
  "trx_in_block": 32,
  "virtual_op": 0
}
2018/01/31 01:12:33
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
voterbutterfly-effect
weight10000 (100.00%)
Transaction InfoBlock #19446257/Trx b578aad61e55c41a008a33438e880fa943f0edf8
View Raw JSON Data
{
  "block": 19446257,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "butterfly-effect",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T01:12:33",
  "trx_id": "b578aad61e55c41a008a33438e880fa943f0edf8",
  "trx_in_block": 15,
  "virtual_op": 0
}
2018/01/31 01:12:33
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
voterbetacore
weight10000 (100.00%)
Transaction InfoBlock #19446257/Trx b9cbb1585b633621dd6370b241dfcd0a8afee220
View Raw JSON Data
{
  "block": 19446257,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "betacore",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T01:12:33",
  "trx_id": "b9cbb1585b633621dd6370b241dfcd0a8afee220",
  "trx_in_block": 12,
  "virtual_op": 0
}
2018/01/31 01:12:33
authorsteven.tjg
permlinkhow-to-implement-seamless-otp-on-android
voteralphacore
weight2000 (20.00%)
Transaction InfoBlock #19446257/Trx 8de47fd328aeb68e9cb0f17650b6f902de675cc9
View Raw JSON Data
{
  "block": 19446257,
  "op": [
    "vote",
    {
      "author": "steven.tjg",
      "permlink": "how-to-implement-seamless-otp-on-android",
      "voter": "alphacore",
      "weight": 2000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-01-31T01:12:33",
  "trx_id": "8de47fd328aeb68e9cb0f17650b6f902de675cc9",
  "trx_in_block": 11,
  "virtual_op": 0
}

Account Metadata

POSTING JSON METADATA
profile{"name":"Steven","location":"Indonesia","profile_image":"https://s26.postimg.org/5u0cys9s9/20150910_144612.jpg"}
JSON METADATA
profile{"name":"Steven","location":"Indonesia","profile_image":"https://s26.postimg.org/5u0cys9s9/20150910_144612.jpg"}
{
  "posting_json_metadata": {
    "profile": {
      "name": "Steven",
      "location": "Indonesia",
      "profile_image": "https://s26.postimg.org/5u0cys9s9/20150910_144612.jpg"
    }
  },
  "json_metadata": {
    "profile": {
      "name": "Steven",
      "location": "Indonesia",
      "profile_image": "https://s26.postimg.org/5u0cys9s9/20150910_144612.jpg"
    }
  }
}

Auth Keys

Owner
Single Signature
Public Keys
STM5YecQd5WyTDm9i91wUKo5uYGo6NBEt4Xjm69spjspDZsaSfK781/1
Active
Single Signature
Public Keys
STM68gq4qwGoFRu9cv9fmpxDikKD9pixNcTT32jWiWpoVPkVzkMFj1/1
Posting
Single Signature
Public Keys
STM8JeGoZdBiDEyZ72Ayn8RewMY4t4Kxvwv3ZYECyECuRCZhNydFr1/1
App Permissions
Memo
STM6yiWpqPcKUeo3ospn48DstZSJNGcHPyPZYyENWeyYDKnkeMeRZ
{
  "owner": {
    "account_auths": [],
    "key_auths": [
      [
        "STM5YecQd5WyTDm9i91wUKo5uYGo6NBEt4Xjm69spjspDZsaSfK78",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "active": {
    "account_auths": [],
    "key_auths": [
      [
        "STM68gq4qwGoFRu9cv9fmpxDikKD9pixNcTT32jWiWpoVPkVzkMFj",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "posting": {
    "account_auths": [
      [
        "utopian.app",
        1
      ]
    ],
    "key_auths": [
      [
        "STM8JeGoZdBiDEyZ72Ayn8RewMY4t4Kxvwv3ZYECyECuRCZhNydFr",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "memo": "STM6yiWpqPcKUeo3ospn48DstZSJNGcHPyPZYyENWeyYDKnkeMeRZ"
}

Witness Votes

0 / 30
No active witness votes.
[]