web-dev-qa-db-ja.com

ListViewで選択した行を強調表示する

アルバムのリスト(数百)があります。選択したアルバムをタッチすると、ユーザーにアルバム全体を再生するか、トラックのListViewに移動するかを選択できるようになります。問題ない。ただし、albumListViewでablumをタッチした後、ユーザーがクリックしたアイテムを認識できるように行を強調表示したままにしておき、[OK]または[PLAY]に移動できるようにします。 ListViewで行を強調表示するにはどうすればよいですか?

37
user611089

http://Android-developers.blogspot.de/2008/12/touch-mode.html から引用

テキストアイテムのリストを表示する単純なアプリケーション、たとえばApiDemosを想像してください。ユーザーはトラックボールを使用してリスト内を自由に移動できますが、タッチスクリーンを使用してリストをスクロールおよびフリングすることもできます。このシナリオの問題は、ユーザーがタッチスクリーンを介してリストを操作するときに、選択を適切に処理する方法です。

この場合、ユーザーがリストの一番上にあるアイテムを選択し、リストを下に向けると、選択はどうなりますか?アイテムに残して、画面からスクロールする必要がありますか?ユーザーがトラックボールで選択範囲を移動することにした場合、どうなりますか?さらに悪いことに、ユーザーがトラックボールを押して、現在選択されているアイテム(画面に表示されなくなったアイテム)を操作するとどうなりますか?

慎重に検討した結果、ユーザーがタッチスクリーンを介してUIを操作したときに、選択を完全に削除することにしました。

タッチモードでは、フォーカスも選択もありません。グリッド内のリストで選択されたアイテムは、ユーザーがタッチモードに入るとすぐに選択解除されます。 。同様に、フォーカスモードのウィジェットは、ユーザーがタッチモードに入るとフォーカスがなくなります。以下の画像は、トラックボールでアイテムを選択した後にユーザーがリストをタッチするとどうなるかを示しています。

35
Maaalte

その他のソリューション(主にXML)

1)choiceModeListViewsingleChoiceに設定します

<ListView
    Android:choiceMode="singleChoice"
.../>

2)リストの項目は Checkable でなければならず、 Color State List を背景として使用します

例:album_item.xml

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:background="@drawable/list_selector"
.../>

3)背景の色の状態(list_selector.xml)ハイライトの色を定義します

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@color/green" Android:state_checked="true"/>
    <item Android:drawable="@color/green" Android:state_pressed="true"/>
</selector>
42
Hiep

Maaalteは正しいです。タッチモードでは現在のアイテムがないため、タッチモードのリストでは現在のアイテムにフォーカスのハイライトが表示されません。あなたが説明しているようなステートフルな選択は、UIの他の部分と対話している間も持続しますが、別の問題です。

CHOICE_MODE_SINGLEを使用して、リストでステートフル選択を表現できます。選択をチェック状態として扱います。アダプタが返すビューがCheckableインターフェイスを実装している限り、選択した状態を選択して表示できます。 (アイテムビューまたはその他の背景を設定します。実際にはチェックボックスウィジェットを表示する必要はありません。)その後、ListViewのアイテムチェックメソッドを使用して、選択を操作または決定できます。

19
adamp

ListViewを拡張し、getView()メソッドをオーバーライドすることでこれを解決しました。 「選択済み」状態の内部識別子を保持し、それに応じてアイテムの背景を次のように変更しました。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View currView = super.getView(position, convertView, parent);
StateListItem currItem = getItem(position);
if (currItem.isItemSelected) {
    currView.setBackgroundColor(Color.RED);
} else {
    currView.setBackgroundColor(Color.BLACK);
}
return currView;
}  

私のブログ投稿にプログラム例があります: http://udinic.wordpress.com/2011/07/01/selectablelistview-make-selection-work/

12
Udinic

ここに私のソリューションのリストビューがあります:

<ListView
        Android:id="@+id/list"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:background="@Android:color/white"
        Android:divider="@Android:color/darker_gray"
        Android:dividerHeight="1dp"
        Android:paddingLeft="10dip"
        Android:paddingRight="10dip"
        Android:choiceMode="singleChoice"
        Android:paddingTop="8dip" >
    </ListView>

List_rowのセレクターとして

<!-- <item Android:drawable="@color/Android:transparent"  Android:state_selected="true" /> -->
<item Android:drawable="@Android:color/darker_gray" Android:state_selected="true"/>
<item Android:drawable="@Android:color/darker_gray" Android:state_activated="true"/>    
<item Android:drawable="@Android:color/darker_gray" Android:state_pressed="true"/>
<item Android:drawable="@color/Android:transparent"/>

State_activated = trueの項目があることを確認してください

次に、このセレクターをlist_rowの背景として追加します

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:layout_width="match_parent"
  Android:layout_height="match_parent"
  Android:background="@drawable/listitem_selector"
  Android:orientation="vertical" >

<TextView
    Android:id="@+id/itemName"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" />
11
subair_a

Android:background="?activatedBackgroundIndicatorを追加
Android.R.layout.simple_list_item_activated_2.xmlに似たアイテムのメインレイアウトを一覧表示する

6
denis

単一選択モードでリストを実装します:_Android:choiceMode=singleChoice_

デフォルトの_Android.R.layout.simple_list_item_single_choice_がRadioButtonを使用して選択された選択肢を示すように、リスト項目レイアウトにカスタムハイライト状態などを実装して、選択肢の変更に対応できます。 getCheckedItemPosition()などのメソッドをアプリケーションで使用して、必要に応じてユーザーが現在選択しているアイテムを判断できます。

お役に立てば幸いです!

5
Devunwired

この質問が最後にアクティブになってから2年が経ちますが、将来他の誰かがそれを必要とする場合に備えて。これが私のListView xmlコードです

<ListView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/results"
        Android:choiceMode="singleChoice"
        Android:listSelector="#ffdb700b"/>

Android:listSelector値を変更したい。

4
jrsall92

次のソリューションは、1つまたは複数のリストアイテムを強調表示するために使用できます。開始点:ArrayAdapter実装を介してMyEntityのリストを表示するListFragmentがあります。アイテムが選択されている場合、アイテムレイアウトの一部としてのTextViewの色はグレーに変更する必要があります。複数のアイテムを選択できるようにする必要があります。

  1. ListFragmentは、onListItemClicked()で呼び出されるOnItemSelectListener(YourEntity item)を提供する必要があります。

    public void onListItemClick(ListView l, View v, int position, long id) {
      MyEntity entity = (MyEntity) getListView().getItemAtPosition(position);
      if (entityListSelectListener != null) 
        itemSelectListener.onItemSelect(entity); }
    
  2. ArrayAdapterは、選択されたアイテムのキーフィールドのリストを所有し、マネージャーメソッドaddSelection(MyEntity)およびclearAllSelections()を提供します。オーバーライドされたメソッドgetView()は、キーフィールドリストを読み取り、実際の位置がそこにある場合、特定のTextViewの色を灰色に変更し、そうでない場合は透明に変更します。

    public View getView(int position, View convertView, ViewGroup parent) {
      ...
      if (selectedEntityList.contains(entity.key)) //... highlight view field }
    
  3. 所有アクティビティのonCreate()では、ArrayAdapterを管理するためにリスナーを実装する必要があります:addSelection()およびnotifyDataSetChanged()を呼び出します。

    entityListFragment.setEntityListSelectListener(
      new EntityListFragment.OnItemSelectedListener() {
        public void onItemSelect(MyEntity entity) {
        aa.addSelection(entity);
        aa.notifyDataSetChanged(); }});
    

私は同じ問題を抱えていたので、ListViewコードに次のコードを貼り付けて解決しました

Android:choiceMode="singleChoice"
Android:listSelector="#003366"

Xmlファイルは次のようになります

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent">

<ListView
    Android:id="@+id/file_list"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:choiceMode="singleChoice"
    Android:listSelector="#003366"/>

<Button
    Android:id="@+id/select"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:text="SELECT"
    Android:layout_below="@id/file_list"/>

</RelativeLayout>
2
Rijul Gupta

私の場合、simple_list_item_2を使用するときの唯一の解決策は、アダプターのgetView()メソッドをオーバーライドし、背景色を手動で変更することでした。

listview = new SimpleAdapter(ctx, data,
                Android.R.layout.simple_list_item_2, res,
                new String[] {"field1", "field2" },
                new int[] {Android.R.id.text1, Android.R.id.text2 })

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View view = super.getView(position, convertView, parent);

                if (this_is_the_selected_item)
                {
                    view.setBackgroundColor(0xff999999);
                }
                else
                {
                    view.setBackgroundColor(Color.BLACK);
                }
                return view;
            }
        };

選択したアイテムを変更するときは、必ずlistview.invalidateViews()を呼び出してください。

1
CpnCrunch

これが私がやったことです:)-大きな頭を壁に打ちつけた後。

アダプターの場合:

 radioAdapter = new RadioAdapter(context, R.layout.row_layout, yourData);

Row_layout.xmlの場合:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/radio_name"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_gravity="center_vertical"
Android:padding="10dp"
Android:background="?android:attr/activatedBackgroundIndicator"
Android:clickable="true"
Android:text="SOME RADIO"
Android:textColor="@color/Gray"
Android:textSize="25dp" />

デフォルトの位置を強調表示するように設定するには、listViewオブジェクトにこれを実行します:

radioTitleList.setItemChecked(defaultPosition、true);

リストをクリックしたときに強調表示したい場合:

カスタムリストアダプタのgetView()で、ビューを返す前にこれを追加します。

 row.setOnClickListener(new OnClickListener() 
 {
 @Override
 public void onClick(View arg0) 
 {
     radioTitleList.setItemChecked(position, true);
             // other stuff like navigating to a new activity etc
     }
 });
0
ryvianstyron