管理人が気まぐれでいろいろ書きます。
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
AndroidのListViewの読み込み高速化
お久しぶりです。
最近はもっぱらAndroidで遊んでます。

実験がてらAndroid用のTwitterクライアントを制作しているのですが、その中で見つけたListViewの読み込み高速化の方法を書こうと思います。

まずはじめに今回紹介するListViewの読み込み高速化の方法はすべての場合で有効なのかは未検証なのでなんとも言えないのです。

今回の方法で高速化する前は具体的にどんな状況だったのかというとListViewの一つの項目内にImageViewだったりTextViewだったりを埋め込んだカスタムListViewでまだ一度も表示していないListView内の項目を表示するときにスクロールがもっさりしてカクカクしてしまう状態でした。

そこでこちらで書かれている方法でListView内のレイアウトの使い回しをすることで高速化を図りました。
この方法ですでに一度表示した項目のスクロールはある程度は高速化とCPU負荷を低減できました。
(参考にさせて頂いたサイトの管理人様ありがとうございます)


しかしやはりまだ一度も表示していない項目にスクロールするとカクツキが出てしまう現象が現れていました。
まとめると

一度表示した項目へのスクロール → 高速
まだ一度も表示していないListViewの表示領域から見きれた項目へのスクロール → カクツク

という状態です。

そこで上で実行した一度つくったレイアウトの使い回しで高速化のターゲットとなっていたのと同じように未表示項目は新規に作成するみたいなので、それに時間がかかっているのだと推測しました。(あっているのかはわかりませんが・・・・)

この推測がもしも正しいなら未表示領域に対して手動でArrayAdapterのgetViewメソッドを呼び出せばいいのではないかと思い試してみました。

するとうまく高速化できました。


getViewメソッドの引数(実際は違うみたいですが自分の脳内イメージ)

getView(項目を取得(作る)番号, 前に作ったレイアウトがあるかどうか, その項目が入るListView);

今回は下に項目がつかされる方式のツイッタークライアントを制作していたのでgetViewの第一引数にリスト内の一番下、つまり追加したばかりの項目を作るように指定しています。

第三引数はその項目がつかされているListViewを指定してあげればいいのです。

ListView.getAdapter().getView(ListView.getCount() - 1, null, ListView);

これを新しく入ってきたツイートをListViewに追加するたびに呼び出すようにしました。

第2引数はちょっとよくわかっていないのですがNullを渡しても動きます。
しかしNullにしていしまうと項目のレイアウトを使いまわす高速化が意味をなさなくなってしまうような気がする・・・
そこはまた調べてみます


スポンサーサイト
実装予定
今後ベータ版までに追加予定の機能は次のものです。

・設定画面からログイン、ログアウト(アカウント切り替え)出来るようにする。
・アカウントのAPIの使用回数を表示する
・アイコンを表示する
α版
制作途中ですがとりあえずAPIからユーザーのホームTLの取得を実装しました。
いままでユーザー認証部分で詰まっていたのですが普通にrss形式で取得できました・・・

このあとホームTL意外のTL所得モードも付ける予定です。
今現在のソースは続きを読むへ
とりあえず
テゥイストリームですが、とりあえず最新のパブリックTLを20件取得して表示するところまでつくりました。
このあとは文字を画面上流れるようにする部分と設定画面を作りたいです・・・

今のところのコードは続きを読むでみられます
twistreamプロジェクト
ツイッターのクライアント開発計画としてtwistreamプロジェクトを立ち上げました。
現在開発中です。

twistreamの方向性としては小型で常に表示していても邪魔にならず、そして手軽に使えるツイッタークライアントを目指しています。
今のところTLを横にテロップを流すように表示しようと考えているのですが、それではTLの時間軸がつかみづらくなるので、できればTLの流れの時間軸をつかみやすく表示できたらなぁ、と考えています。(今のところ解決策は見つかっていませんが・・・)

まだ色々な機能がハリボテだったり、ただボタンを設置しただけという状態ですがとりあえず2月27日0:30現在のコードの状態はこんな感じです・・・
※画面の表示部分の開発中なのでこれをコンパイルしても黒い画面がでるだけです;;

title "twistream α"

#include "hspinet.as"
#include "mod_rss.as"

netinit
if stat!0 : dialog "ネット接続初期化エラー",1 : goto *owari


//変数初期化
sdim twiout,140,50
sdim twiurl,256,50

twiusername=""
twipass=""

goto *tmpl1

//新規命令
//パブリックTL取得
#deffunc gettl int tlmode

//publicTL
if tlmode=0 : userurl="http://twitter.com/statuses/public_timeline.rss"
//userTL
if tlmode=1 : userurl="http://twitter.com/statuses/user_timeline/"+twiusername+".rss"

rssload twiout, twiurl, userurl , 20

if stat!0 : dialog "RSS所取得エラー", 1 : goto *owari

return

*tmpl1




sdim set,24//設定情報用数値変数
sdim stmp,125,5//メモ用領域
ddim itmp,5


//設定読み込み
dirlist stmp.0,"*.ini",1//設定ファイルがあるか調べる

notesel stmp.0

repeat notemax,0//ループ
noteget stmp.1,cnt

if stmp.1="setting.ini" : goto *tmpl0

loop

//デフォルトの表示位置の設定
notesel stmp.2
noteadd "0"//窓のX位置
noteadd "0"//窓のY位置
bsave "setting.ini",tmp.2,-1,-1



*tmpl0
notesel set
noteload "setting.ini",-1
noteget set.0,0//窓のX座標
noteget set.1,1//窓のY座標

;--------------------------------------

//ツイッターログイン画面
screen 0,460,180,0,ginfo(20)/2,ginfo(21)/2,500,200
pos 20,20
mes "ユーザーネーム:"

pos 145,20
input twiusername,300,24,50

pos 53,60
mes "パスワード:"

pos 145,60
input twipass,300,24,50

pos 145,94
objsize 300,36
button goto "ログイン",*tmpl2

pos 395, 140
objsize 50,24
button goto "終了",*owari
stop


*tmpl2

//メイン画面
bgscr 0,800,24,0,int(set.0),int(set.1)
cls 0

buffer 1,800,24,0//仮想画面

gsel 0,1

//設定画面
pos 0,0
objsize 10,24
button goto " ",*setting

gettl 0

//画面表示部分

//表示テスト部分
gsel 1
foreach twiout
color 256,256,256
boxf 10,0,800,24//塗りつぶし
mes twiout(cnt)
wait 100

gsel 0//実際に描画
pos 10,0

gcopy 1,10,0,790,24

loop
//


wait 200




*owari

netterm//ネット接続終了
end

//サブルーチン
*setting
//設定画面の準備
gsel 0
itmp.0=ginfo(4)
itmp.1=ginfo(5)+24
bgscr 2,400,300,0,itmp.0,itmp.1,400,300
button goto "設定",*tmpl3

button goto "終了",*owari
stop

*tmpl3
gsel 2,-1

goto *tmpl2


stop
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。