ListViewのonItemClickイベントに関して

3,750 views
Skip to first unread message

イトバウ

unread,
Oct 22, 2010, 11:49:12 AM10/22/10
to Android-SDK-Japan
 はじめまして。イトバウと申します。
 今、ListViewを使ってアプリを作成しています。そこで質問です。現状 Selectorを利用して選択行の色を変更することができました。し
かし 色は変更されたのですが、タッチをやめると選択色が解除されてしまいます。selectorのパラメータを変更してみていろいろ試してみたのです
が、タッチをやめるとやはり選択色が保持されません。
 そこで、リストの項目が選択された時に発生するonItemClick() イベント内で選択された項目のViewをsetBackGround()
で背景色を描画する方法をとりました。この方法だと項目をタッチした後も色を保持することができました、しかし他の項目を選択するたびに選択したすべて
の項目の背景色が変わってしまい、どの項目が選択状態かわからなくなります。onItemClick()時に 選択された行以外の情報を取得するにはど
のようにすればよいのでしょうか?また簡潔にリスト選択時の選択行の色を保持する方法などあるのでしょうか?
ご存知の方がいっらしゃいましたら、ご教授お願い致します。

HideCheck

unread,
Oct 22, 2010, 10:54:21 PM10/22/10
to android-...@googlegroups.com
hidecheckです

これだけでは、分かりません。
セレクターのxml設定をおしえていただけますか。あと、セレクターを設定しているxmlまたはソース

よろしくお願いします

2010年10月23日0:49 イトバウ <ito...@gmail.com>:

> --
> このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
> このグループに投稿するには、android-...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。
>
>

あんざいゆき

unread,
Oct 22, 2010, 11:01:56 PM10/22/10
to android-...@googlegroups.com

あんざいです。

selector で管理するよりも、行の View を(この場合 TextView かな?) に checkable を implements するのがいいと思います。

もしくは、すでに ckeckable が implements されている CheckedTextView を TextView の変わりにつかって、ラジオボタンを非表示にすればいいと思います。

言葉だけだとわかりにくいですよね。
今出先なので後でサンプル出します。

2010/10/23 11:54 "HideCheck" <hide...@gmail.com>:

HideCheck

unread,
Oct 23, 2010, 12:17:15 AM10/23/10
to android-...@googlegroups.com
hidecheckです。

あんざいさん
↓これなんで?って思ったので、よければ理由お願いします。


> selector で管理するよりも、行の View を(この場合 TextView かな?) に checkable を implements
> するのがいいと思います。

あと、過去の経験ですが、ListViewの行にxml指定でselectorを使ったときに、うまくいかないことがありました。
そのときは、Adapterクラスのソースに直接setBackgroundでselectorを指定してました。
ご参考までに。

よろしくお願いします


2010年10月23日12:01 あんざいゆき <anzai...@gmail.com>:

Message has been deleted

イトバウ

unread,
Oct 23, 2010, 1:31:40 AM10/23/10
to Android-SDK-Japan
hidecheckさん
お世話になります。ご回答ありがとうございます。2通の返信に対して回答させていただきます。

>セレクターのxml設定をおしえていただけますか。あと、セレクターを設定しているxmlまたはソース

まず Selectotrのxmlは以下のように設定しています 。とりあえず、タッチしたときのみ色を変えるようにしてます。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/press_select_color" />
</selector>


また selector設定しているxmlの抜粋箇所は以下のとおりです。


<ListView
android:id="@+id/listviewmain"
android:listSelector="@xml/selectorsetting"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>


>あと、過去の経験ですが、ListViewの行にxml指定でselectorを使ったときに、うまくいかないことがありました。
>そのときは、Adapterクラスのソースに直接setBackgroundでselectorを指定してました。 ご参考までに。
 そのような方法もあるのですね。調べてみます。

以上です。よろしくお願いします。

Message has been deleted

イトバウ

unread,
Oct 23, 2010, 1:41:44 AM10/23/10
to Android-SDK-Japan
あんざいゆきさん
お世話になります。ご回答ありがとうございます。

>selector で管理するよりも、行の View を(この場合 TextView かな?) に checkable を implements するのがいいと思います。
>、すでに ckeckable が implements されている CheckedTextView を TextView の変わりにつかって、ラジオボタンを非表示にすればいいと思います。
 今はとりあえず TextViewのみで行のViewを構成しています。そのようなTextViewクラスがあるのですね。調べてみます。

>言葉だけだとわかりにくいですよね。 今出先なので後でサンプル出します。
 ありがとうございます。是非参考にさせて頂きたいと思います。

あんざいゆき

unread,
Oct 23, 2010, 7:00:41 PM10/23/10
to android-...@googlegroups.com
hidecheck さん

 ・選択した(=タップした)行の色を変えたい
 ・どれか一つだけ行の色を変えたい(=新しい行をタップしたら、前のは色を戻す)

 これって、ラジオボタンがついた List の挙動だと思ったからです。
 ようは、ラジオボタンのどれか一個が選択状態になるかわりに
 どれか1個の行の色が変わればいいと思ったので、 List 自体に
 どの行が選択されているかの情報を保持してもらったほうが
 管理が楽なのでは?との考えです。


とりあえず、こんな感じでどうですか?

package yanzm.example.checklistbgcolorsample;

import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckedTextView;
import android.widget.ListView;

public class CheckListBgcolorSample extends ListActivity {

ListView listView;
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String[] data = {
         "Clock", "Camera", "Book", "Calculator",
         "Clock", "Camera", "Book", "Calculator"
        };
        
        MyAdapter adapter = new MyAdapter(this, R.layout.list_item, data);
        setListAdapter(adapter);

        listView = getListView();
        listView.setItemsCanFocus(false);
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
}
class bindData {
String text;
public bindData(String text) {
this.text = text;
}
}

public class MyAdapter extends ArrayAdapter<String> {
private LayoutInflater inflater;
private int layoutId;

public MyAdapter(Context context, int layoutId, String[] objects) {
super(context, 0, objects);
this.inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.layoutId = layoutId;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(layoutId, parent, false);
}
//String data = getItem(position);
((CheckedTextView)convertView).setText("position : " + position + ", checkedPosition : " + listView.getCheckedItemPosition());

if(position == listView.getCheckedItemPosition())
((CheckedTextView)convertView).setBackgroundColor(Color.DKGRAY);
else
((CheckedTextView)convertView).setBackgroundColor(Color.TRANSPARENT);
return convertView;
}
}
}

res/layout/list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/checkedtextview"
android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingLeft="10dip"
android:gravity="center_vertical"
    />
    <!-- 
android:checkMark="?android:attr/listChoiceIndicatorSingle"
    
     -->




2010年10月23日13:17 HideCheck <hide...@gmail.com>:



--
あんざい ゆき
anzai...@gmail.com
twitter : @yanzm

イトバウ

unread,
Oct 23, 2010, 9:57:30 PM10/23/10
to Android-SDK-Japan
あんざいゆきさん
お世話になります。ご回答ありがとうございます。

>とりあえず、こんな感じでどうですか?
 教えて頂きましたサンプルを元に動作確認したところ、まさに私が行いたかった動作そのものでした。
ありがとうございました。また何かありましたらご教授お願い致します。

HideCheck

unread,
Oct 24, 2010, 2:28:41 AM10/24/10
to android-...@googlegroups.com
あんざいさん
なるほど。ラジオボタンの動作に似てますね。
説明ありがとうございます。

イトバウさん
もう解決済みのようですが、セレクターの設定に問題があるように思えます。タッチの時の設定はしてますが、フォーカス時の設定がないため、タッチ後に色がもとに戻ってるのが原因のようです。Androidがデフォルトで使用しているselectorを参考にするといいと思います。
http://developer.android.com/resources/samples/Home/res/drawable/grid_selector.html


ありがとうございます。

2010年10月24日8:00 あんざいゆき <anzai...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages