画像付チェックリストの方法

280 views
Skip to first unread message

花田

unread,
Jun 4, 2011, 5:37:56 AM6/4/11
to 日本Androidの会

いつもお世話になっております。

花田と申します。

現在、画像付の複数チェックのできるリストを作っています。

ご質問があります。

画像付チェックボックスリストを作る上で、どのやり方が良いのか悩んでいます。

リスト1行分の表示内容は
ーーーーーーーーーーーーーーーーーーー
|ImageView
|アイコン-----    ユーザーネーム  チェックボックス
|画像---------    TextView
|----------------
ーーーーーーーーーーーーーーーーーーー
アイコンはmixiのマイミクアイコンです。

今実装しているのは
Activityで取得したデータをMapに格納し、listに格納し、adapterにセットしています。
adapterはSimpleAdapterを継承したオリジナルのAdapterを作成しgetViewメソッドを呼んでいるという感じです。
(画像はURLからBitmapに変換しそのままImageViewにセットしています)

表示は出来ているのですが、スクロールがかなり重くアプリ自体がダウンすることが多々あります。
また、チェックボックスに関してはCHOICE_MODE_MULTIPLEをしたほうがよいのかそれとも、getViewメソッド内でチェックボック
スのオブジェクトを作ったほうがよいのか悩んでいます。

サイトをみていると、ListViewは色々な表示方法があるように思います。
Adapterの種類にしても。

私が今実現しようとしている
アイコンーーユーザーネームーーーチェックボックス
上記の形は、どの方法がよいのかご教授お願い致します。


チェックボックスとアプリがダウンするという二つの質問だったのですが、
これは別々でスレッドを立てたほうが良かったでしょうか・・・
分かりづらい説明で申し訳ありません。
理解できない箇所がありましたら、遠慮なくおっしゃってください。

宜しくお願い致します。

花田

sys1yagi

unread,
Jun 4, 2011, 8:57:17 AM6/4/11
to android-g...@googlegroups.com
こんにちは。yagiです。

僕なら以下のようにします。

・表示
SimpleAdapterにViewBinderをセットして処理する。これは好みなのでなんでもいいと思います。

・チェックボックス
一行毎に独立しているのでCHOICE_MODE_MULTIPLはいらないと思います

・アプリのダウン
多分アイコンの読み込みによるOOMなので、
WeakReferenceでキャッシュします。
スクロールをスムーズにするために、読み込み、表示はAsyncTaskなどで非同期化します。
元のアイコンサイズが統一でなければBitmapFactory.Optionsで読み込む解像度などを調整します。

----------------------------------------
name: yagi
blog: http://visible-true.blogspot.com/
android: https://market.android.com/developer?pub=yagi

五嶋克典 Gotoh,Katsunori

unread,
Jun 4, 2011, 11:26:04 AM6/4/11
to android-g...@googlegroups.com
五嶋と申します。

ArrayAdapterを拡張すれば、自由にできるので
個人的にはいつも、こちらを利用しています。
今回の場合ですと、↓みたいな感じで。
class MixiAdapter extends ArrayAdapter<MixiMapList>

アプリがダウンする原因は何でしょうか?
原因が不明なので、見当違いかもしれませんが、画像のダウンロードは
別スレッドで行う等の工夫が必要なのかもしれませんね。

 

花田智憲

unread,
Jun 5, 2011, 3:39:51 AM6/5/11
to android-g...@googlegroups.com
sys1yagi さん
五嶋さん

ご返答有難うございます。

五嶋さんのArrayAdapterを使用しBeenクラスを作成しました。
今の私のプログラム力ではSimpleAdapterがよく理解できていなかったです。
ちょっと難しかったので、ArrayAdapterで実装致しました。

スクロールもスムーズに動きました。
有難うございます。

sys1yagi さんの
>スクロールをスムーズにするために、読み込み、表示はAsyncTaskなどで非同期化します。
AsyncTaskクラスの存在は知りませんでした。
こちらもやってみたいと思います。


チェックボックスでご質問があるのですが、
チェックボックスのデータを取得するプログラムは
getView内で行えばよろしいのでしょうか。

Activity内で行えばよいのか、まだ、ViewとActivityとの関連性がはっきり把握できていなくて・・・

申し訳ありません、技術不足で・・

花田

2011年6月5日0:26 五嶋克典 Gotoh,Katsunori <katsunori...@gmail.com>:


 

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
To view this discussion on the web visit https://groups.google.com/d/msg/android-group-japan/-/bDZtNl8zZHdsWk1K.

このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。

五嶋克典(Gotoh,Katsunori)

unread,
Jun 5, 2011, 6:02:44 AM6/5/11
to android-g...@googlegroups.com
五嶋です。
上手くいったみたいで良かったですね^^

Activity内のOnItemClickListenerで拾えばOKです。

例)
listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
                   

CheckBox cb = (CheckBox)view,findViewById(R.id.xxxx);
if (cb.isChecked()){
  ・・・・
  ・・・・
}   

※positiobに配列の何番目か入っています。

五嶋克典(Gotoh,Katsunori)

unread,
Jun 5, 2011, 6:17:04 AM6/5/11
to android-g...@googlegroups.com
五嶋です。

【補足情報】
OnItemClick内で、役に立ちそうなものを。

現在表示されている最初の位置:parent.getFirstVisiblePosition()
現在表示されている最後の位置:parent.getLastVisiblePosition()

parentから、行のViewを取得したい場合
View v = (View) parent.getChildAt(row);

花田智憲

unread,
Jun 5, 2011, 6:30:35 AM6/5/11
to android-g...@googlegroups.com
五嶋さん

有難うございます。
ご丁寧な回答を。

リスナーをセットしたのですが、チェックボックスが反応してくれないです。
ブレークポイントをつけて1行づつ見たのですが、
friendList.setOnItemClickListener(new OnItemClickListener() {
の中を走ってくれません。

xmlとの紐付けの箇所に問題があるのでしょうか?


        friendList = (ListView)findViewById(R.id.friend);
        /* adapterとxmlの紐付 */
        adapter = new FriendListAdapter(FriendListActivity.this, R.layout.friend_row, list);
        /* Listにadapterセット */
        friendList.setAdapter(adapter);

        friendList.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
CheckBox checked = (CheckBox) view.findViewById(R.id.chk);
if (checked.isChecked()) {
Toast.makeText(FriendListActivity.this, "Checked" + position, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(FriendListActivity.this, "UnChecked" + position, Toast.LENGTH_SHORT).show();

}
}
        });


度々、申し訳ありません・・・

花田

2011年6月5日19:02 五嶋克典(Gotoh,Katsunori) <katsunori...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。

五嶋克典

unread,
Jun 5, 2011, 6:36:18 AM6/5/11
to android-g...@googlegroups.com
五嶋です。

もし、レイアウト定義(XML)なりで、android:clickable="true"や
プログラムでクリック可能にしている場合、それを削除してみて
下さい。
OnClickがあると、OnItemClickに来ないようです。。。
来るようにする方法を前に、どこかのサイトで見つけましたが
失念しました。。
確か、focusに関する内容だったと思いますが。

五嶋克典

unread,
Jun 5, 2011, 7:00:28 AM6/5/11
to android-g...@googlegroups.com
連投、ごめんなさい。
五嶋です。


List内のcheckboxに、android:focusable="false"
を追加すれば動くかもです。


花田智憲

unread,
Jun 5, 2011, 9:27:39 PM6/5/11
to android-g...@googlegroups.com
五嶋さん

ご返答有難うございます。


>List内のcheckboxに、android:focusable="false"
やってみたのですが、チェックボックスが反応してくれないのです。。。

XMLは以下です。

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:baselineAligned="true"
>

<!-- チェックボックス -->
<CheckBox android:id="@+id/chk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
/>
<!-- ユーザーアイコン画像-->
<ImageView android:id="@+id/friend_icon"
android:layout_width="wrap_content"
android:layout_height="50dp"
/>
<!-- ユーザーネーム -->
<TextView android:id="@+id/friend_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/lightgreen"
android:textSize="20dp"
/>
</LinearLayout>


Activity内が以下です。
        friendList.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
CheckBox checked = (CheckBox) view.findViewById(R.id.chk);
if (checked.isChecked()) {
Toast.makeText(FriendListActivity.this, "Checked" + position, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(FriendListActivity.this, "UnChecked" + position, Toast.LENGTH_SHORT).show();

}
}
        });

色々なサイト見てみたのですが、
五嶋さんの言うとおりFocusで変わるようです。

なぜ反応してくれないのか。。

申し訳ありません、せっかくご教授してくださったのに。

花田




2011年6月5日20:00 五嶋克典 <katsunori...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。

花田智憲

unread,
Jun 5, 2011, 9:35:20 PM6/5/11
to android-g...@googlegroups.com
連投申し訳ありません。

不思議な現象が起きてます・・・

Listに反応しているみたいです。
チェックボックスには反応してなく、
Listをタップすると反応しています。
また、Toastを表示するようにしているので、Toastも表示されています。

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
上記の箇所でブレイクポイントつけているのですが、
そこで止まってくれないという・・・・

すみません、報告でした。

花田


2011年6月6日10:27 花田智憲 <hanad...@gmail.com>:

五嶋克典

unread,
Jun 5, 2011, 9:46:21 PM6/5/11
to android-g...@googlegroups.com
五嶋です。

CheckBoxではなく、CheckedTextViewだと上手く行きそうな予感がしてきました。

花田智憲

unread,
Jun 6, 2011, 2:20:40 AM6/6/11
to android-g...@googlegroups.com
お疲れ様です。
花田です。

同じような現象があるかたいたら教えてください・・

CheckBoxに反応してくれないのです。
にはandroid:focusable="false"
を設定しているのですが。
Listにリスナーを設定しているので、Listは反応するんです。


        /**
         * リスナー設定
         */
        decBtn.setOnClickListener(this);
        friendList.setOnItemClickListener(this);


public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
CheckBox  checked = (CheckBox) view.findViewById(R.id.chk);
if (checked.isChecked()) {
View v = (View) parent.getChildAt(position);
Log.d("VIEW", "" + v);
Toast.makeText(FriendListActivity.this, "Checked" + parent, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(FriendListActivity.this, "UnChecked" + position, Toast.LENGTH_SHORT).show();
}
}
}

サイトも調べてるのですが、難しいです・・・




2011年6月6日10:46 五嶋克典 <katsunori...@gmail.com>:
五嶋です。

CheckBoxではなく、CheckedTextViewだと上手く行きそうな予感がしてきました。


--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。

Tetsuro Nakamura

unread,
Jun 6, 2011, 2:48:57 AM6/6/11
to android-g...@googlegroups.com
t2low と申します。

ArrayAdapterのgetView()が返すViewにCheckableを実装すると良いかもしれません。
上で五嶋さんが仰っているCheckdTextViewはCheckableを実装しています。

http://developer.android.com/intl/ja/reference/android/widget/Checkable.html

ソースなどはほとんど読まずに返信しておりますので、的外れだったらごめんなさい。

以上です。

2011年6月6日15:20 花田智憲 <hanad...@gmail.com>:

花田智憲

unread,
Jun 12, 2011, 10:45:50 PM6/12/11
to android-g...@googlegroups.com
五嶋さん
Tetsuro Nakamuraさん

ご返信遅れてしまって申し訳ありませんでした。

画像付きチェックリスト試行錯誤して実装できました。

上記のプログラムを色々試しながら、何とかできました。

上記の実装はしていませんが、
以下のようなソースです。

friendList.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
UserStatusBeen userBeen = list.get(position);
checked = (CheckBox) view.findViewById(R.id.chk);
if (checked.isChecked()) {
checked.setChecked(false);
userBeen.setChecked(false);
} else {
checked.setChecked(true);
userBeen.setChecked(true);
}
}
        });

Listにリスナーを設定し、チェック判定をbeenに格納、
送信後、beenから判定を取得という形です。

色々、有難うございました。



2011年6月6日15:48 Tetsuro Nakamura <t2l...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages