63

listView で選択したアイテムの背景色を変更する方法を知りたいです。ユーザーがクリックした特定のアイテムのみを変更したい、つまり、ユーザーが別のアイテムをクリックすると、それが強調表示されます。できるだけシンプルに保ち、デフォルトの Android リストビューを使用したいので、代わりに次のコードを使用しました。

record_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                try{
                    for (int ctr=0;ctr<=record_items.length;ctr++){
                        if(i==ctr){
                            record_list.getChildAt(ctr).setBackgroundColor(Color.CYAN);
                        }else{
                            record_list.getChildAt(ctr).setBackgroundColor(Color.WHITE);
                        }
                    }
                }
                catch (Exception e){
                    e.printStackTrace();
                }
                Log.v("Selected item",record_list.getItemAtPosition(i));
            }
        });

これは機能していますが、問題は遅いことです。今、私が行ったのと同じ出力を与えることができる他の方法があるかどうかを知りたいです。

使用してみrecord_list.getSelectedView().setBackgroundColor(Color.CYAN);ましたが、ヌルポインタ例外が発生します。

私もselector.xmlを試しましたが、うまくいきませんでした。さらに、ListView には、listSelector と呼ばれるプロパティが 1 つあります。「リストで現在選択されている項目を示すために使用されるドローアブル」というドキュメントで述べられているように、これはドローアブルです。また、これでうまくいくはずだと思います。はい、エミュレータではうまくいきますが、Galaxyタブではうまくいきません。他の方法も試しましたが、思い通りに機能しません。

4

17 に答える 17

84

現在選択されている要素の位置を追跡できます。

    OnItemClickListener listViewOnItemClick = new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapter, View arg1, int position, long id) {
                mSelectedItem = position;
                mAdapter.notifyDataSetChanged();
        }
    };

そして、アダプターの getView メソッドをオーバーライドします。

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final View view = View.inflate(context, R.layout.item_list, null);

        if (position == mSelectedItem) {
            // set your color
        }

        return view;
    }

私にとっては、それはうまくいきました。

于 2013-06-07T07:03:31.363 に答える
72

セレクターを使用できます。色の値を変更し、必要に応じて以下を変更します。

drawable フォルダー内の bkg.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/pressed" />
<item  android:state_focused="false" 
    android:drawable="@drawable/normal" />
</selector>

drawable フォルダー内の pressed.xml

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
<solid android:color="#FF1A47"/>  // color   
<stroke android:width="3dp"
        android:color="#0FECFF"/> // border
<padding android:left="5dp"
         android:top="5dp"
         android:right="5dp"
         android:bottom="5dp"/> 
<corners android:bottomRightRadius="7dp" // for rounded corners
         android:bottomLeftRadius="7dp" 
         android:topLeftRadius="7dp"
         android:topRightRadius="7dp"/> 
</shape>

drawable フォルダー内の normal.xml

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
<solid android:color="#FFFFFF"/>    
<stroke android:width="3dp"
        android:color="#0FECFF" />

<padding android:left="5dp"
         android:top="5dp"
         android:right="5dp"
         android:bottom="5dp"/> 
<corners android:bottomRightRadius="7dp"
         android:bottomLeftRadius="7dp" 
         android:topLeftRadius="7dp"
         android:topRightRadius="7dp"/> 
</shape>

バックグラウンド ドローアブルを listview カスタム レイアウトに設定し、行ごとに膨張させます

カスタム アダプターでカスタム リストビューを使用することをお勧めします。

  android:background="@drawable/bkg"     

カスタム アダプターを使用していない場合は、次のように listselector を listview に設定できます。

   android:listSelector="@drawable/bkg" 
于 2013-06-07T05:00:45.807 に答える
31

変数の定義

private ListView mListView;

変数の初期化

mListView = (ListView)findViewById(R.id.list_view);

リストビューのOnItemClickListener

   mListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adpterView, View view, int position,
                long id) {
            for (int i = 0; i < mListView.getChildCount(); i++) {
                if(position == i ){
                    mListView.getChildAt(i).setBackgroundColor(Color.BLUE);     
                }else{
                    mListView.getChildAt(i).setBackgroundColor(Color.TRANSPARENT);
                }
            }
        }
    });

プロジェクトのビルドと実行 - 完了

于 2015-05-05T10:49:46.337 に答える
16

クリックした後も項目を強調表示したままにしたい場合は、 onItemClick リスナーで選択されているものとして手動で設定する必要があります

Android ListView で選択した項目が強調表示されたままになります

myList.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {   
        view.setSelected(true); // <== Will cause the highlight to remain
        //... do more stuff                          
    }});

これは、セレクターに state_selected アイテムがあることを前提としています。

<?xml version="1.0" encoding="utf-8"?>
  <selector xmlns:android="http://schemas.android.com/apk/res/android">  
  <item android:state_enabled="true" android:state_pressed="true" android:drawable="@color/red" />
  <item android:state_enabled="true" android:state_focused="true" android:drawable="@color/red" />
  <item android:state_enabled="true" android:state_selected="true" android:drawable="@color/red" />
  <item android:drawable="@color/white" />
</selector>
于 2013-09-25T23:14:00.660 に答える
11

方法 1:

xml レイアウト アクティビティ/フラグメントで ListView を更新します。

<ListView
   ...
   android:choiceMode="singleChoice"
   android:listSelector="@android:color/darker_gray"
/>

これで完了です。

これをプログラムで処理する方法が必要な場合は、方法 2 を使用します...

方法 2:

ListFragment を使用している場合は、ビューを使用して色を設定し、onListItemClick() をオーバーライドできます。選択した現在のビューを保存して、最後の選択の色をリセットします。

ビューはリサイクルされるため、これは 1 つの画面に収まるリストビューでのみ機能することに注意してください。

public class MyListFragment extends ListFragment {
    View previousSelectedItem;
...
    @Override
    public void onListItemClick(ListView parent, View v, int position, long id) {
        super.onListItemClick(parent, v, position, id);
        if (previousSelectedItem!=null) {
            previousSelectedItem.setBackgroundColor(Color.WHITE);
        }
        previousSelectedItem=v;
        v.setBackgroundColor(Color.BLUE);
    }
}
于 2016-06-22T21:20:56.740 に答える
6

最初に、ドローアブル フォルダーに以下のようなセレクター xml ファイルを作成できます。 drawable/list_item_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_activated="true">
      <shape android:shape="rectangle">
        <solid android:color="#333333" />
        <padding android:left="5dp" android:right="5dp" />
      </shape></item>
    <item><shape android:shape="rectangle">
            <solid android:color="#222222" />
        </shape></item>

</selector>

そして、リストビューで背景を次のように指定します

android:background="@drawable/list_item_selector"
于 2013-06-07T05:46:36.347 に答える
5

私が見つけた最も簡単な方法:

アクティビティ XML に次の行を追加します。

<ListView 
... 
android:choiceMode="singleChoice"
android:listSelector="#666666"
/>

または、これらのプロパティをプログラムで設定します。

listView.setSelector(Drawable selector)
listView.setSelector(int resourceId)

私の特定の例:

   <ListView
            android:choiceMode="singleChoice"
            android:listSelector="#666666"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/listView"/>

AJG に感謝: https://stackoverflow.com/a/25131125/1687010

于 2016-05-16T06:49:58.477 に答える
3

選択したリスト項目の背景を強調表示 (赤に変更) し、項目内のテキストの色を白に設定します。

シンプルだが効率的ではない」方法を考え出すことができます: カスタム アダプターで選択したアイテムの位置を維持し、ListView のOnItemClickListener実装でそれを変更します。

// The OnItemClickListener implementation
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    mListViewAdapter.setSelectedItem(position);
}

// The custom Adapter
private int mSelectedPosition = -1;
public void setSelectedItem (int itemPosition) {
    mSelectedPosition = itemPosition;
    notifyDataSetChanged();
}

次に、選択した項目の背景とテキストの色をgetView()メソッドで更新します。

// The custom Adapter
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ...
    if (position == mSelectedPosition) {
        // customize the selected item's background and sub views
        convertView.setBackgroundColor(YOUR_HIGHLIGHT_COLOR);
        textView.setTextColor(TEXT_COLOR);
    } else {
        ...
    }
}

しばらく検索した後、多くの人が設定について言及していることがわかりましたandroid:listSelector="YOUR_SELECTOR"。しばらく試した後、選択した ListView 項目の背景を強調表示する最も簡単な方法は、ListView のレイアウト リソースに設定された 2 行だけで実行できることがわかりました。

android:choiceMode="singleChoice"
android:listSelector="YOUR_COLOR"

activatedBackgroundIndicatorテーマをカスタマイズするなど、他の方法で機能させることもできます。しかし、それはテーマ全体に影響を与えるため、より一般的な解決策になると思います。

于 2015-12-15T06:51:48.793 に答える
2

以下のxmlをlistitemの背景として使用すると、すべての問題が解決します。下にスクロールしても、選択したものが強調表示されます。

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

ありがとう、ナゲンドラ

于 2014-11-28T10:10:48.513 に答える
1

毎回 1 つの項目をクリックする必要があるとします。次に、このコードはうまく機能します。リストビュー名をstlistとしましょう

stList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        // here i overide the onitemclick method in onitemclick listener
            public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {

            //color change
            //selected item colored

            for(int i=0; i<stList.getAdapter().getCount();i++)
            {
                stList.getChildAt(i).setBackgroundColor(Color.TRANSPARENT);
            }

            parent.getChildAt(position).setBackgroundColor(Color.GRAY);

    });
于 2015-05-09T03:48:47.783 に答える