web-dev-qa-db-ja.com

AndroidのListViewアイテムの背景色の変更

ListViewアイテムの背景色をアイテムごとに変更するにはどうすればよいですか。 ListViewアイテムレイアウトでAndroid:backgroundColorを使用すると、これを実現できますが、リストセレクターは表示されなくなります。 drawSelectorOnTopをtrueに設定することでセレクターを再び表示できますが、セレクターはアイテム全体をオーバーレイします。

これらの背景色を変更してセレクターを保持する方法はありますか?

PSセレクター自体を変更したくない。

編集:GMailアプリケーションの作者はこれを正確に達成することができたので、間違いなく可能です。

70
Marek Stój

使用する色ごとに異なる状態ドロアブルを作成する必要があります。

例:list_selector_read.xmlおよびlist_selector_unread.xml

必要なことは、Android:state_window_focused="false"アイテムを除くすべてを透明に設定することです。

次に、リストを描画するときに、各行に対してsetBackgroundResource(R.drawable.list_selector_unread/read)を呼び出します。

ListViewにlistSelectorを設定しないでください。これにより、特定のAndroidフレーバーのデフォルトセレクターが維持されます。

36
Hawkee

これは、上記のコード、最も単純なコードに基づいた変更です。

private static int save = -1;

public void onListItemClick(ListView parent, View v, int position, long id) { 

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

    if (save != -1 && save != position){
        parent.getChildAt(save).setBackgroundColor(Color.BLACK);
    }

    save = position;                

}

役に立つと思います

あいさつ!

26

OK、私はそれをこのように動作させました:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_pressed="false" Android:drawable="@color/BackgroundColor" />
    <item Android:drawable="@color/transparent" />
</selector>

YMMV!

23
Adam

アダプタを使用してこれを行う例は誰も提供していないようです。そのため、「curSelected」アイテムの背景が異なるListViewを表示するためのコードスニペットを投稿すると思いました。

final ListView lv = (ListView)findViewById(R.id.lv);
lv.setAdapter(new BaseAdapter()
{
    public View getView(int position, View convertView, ViewGroup parent)
    {
        if (convertView == null)
        {
            convertView = new TextView(ListHighlightTestActivity.this);
            convertView.setPadding(10, 10, 10, 10);
            ((TextView)convertView).setTextColor(Color.WHITE);
        }

        convertView.setBackgroundColor((position == curSelected) ? 
            Color.argb(0x80, 0x20, 0xa0, 0x40) : Color.argb(0, 0, 0, 0));
        ((TextView)convertView).setText((String)getItem(position));

        return convertView;
    }

    public long getItemId(int position)
    {
        return position;
    }

    public Object getItem(int position)
    {
        return "item " + position;
    }

    public int getCount()
    {
        return 20;
    }
});

リストアイテムの外観を動的に変更する必要がある場合、これは常に私にとって有用なアプローチでした。

11
ubzack

最も簡単な方法はこれです。 ListArrayAdapter内でこれを行うだけです

if(your condition here) rowView.setBackgroundColor(Color.parseColor("#20FFFFFF"));

複雑すぎないでください

7
OWADVL
mAgendaListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//view.setBackgroundColor(Color.RED);

for(int i=0; i<parent.getChildCount(); i++)
{
     if(i == position)
     {
               parent.getChildAt(i).setBackgroundColor(Color.BLUE);
     }
     else
     {
               parent.getChildAt(i).setBackgroundColor(Color.BLACK);
     }

 }
7
Mbolland

Android 2.2メールアプリのソースコードから:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_window_focused="false" Android:state_selected="true"
        Android:drawable="@Android:color/transparent" />
    <item Android:state_selected="true"
        Android:drawable="@Android:color/transparent" />
    <item Android:state_pressed="true" Android:state_selected="false"
        Android:drawable="@Android:color/transparent" />
    <item Android:state_selected="false"
        Android:drawable="@color/message_item_read" />
</selector>

これ以上言うことはありません...

7
ThePCWizard

アイテムのレイアウトをすべて変更する単純なコード(カスタムリストビューはbaseadapterを拡張します):

lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {

            RelativeLayout layout=(RelativeLayout) arg1.findViewById(R.id.rel_cell_left);
            layout.setBackgroundColor(Color.YELLOW);



        }
    });
5

カスタムリスト項目をクリックすると、背景色を変更するつもりでしたか?

その場合:

Xmlのリストビューレイアウトに次のコードを追加するだけです。


Android:drawSelectorOnTop = "true" Android:listSelector = "@ Android:drawable/list_selector_background"


ここのリストセレクターは、濃い灰色のデフォルトセレクターを使用します。独自のドロアブルを作成して、上記のようにリストセレクターに割り当てることができます。

これがあなたが望んでいたことを願っています。

4
PrasadW

実行中の非常にゆっくりした方法

mAgendaListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//view.setBackgroundColor(Color.RED);

for(int i=0; i<parent.getChildCount(); i++)
{
     if(i == position)
     {
               parent.getChildAt(i).setBackgroundColor(Color.BLUE);
     }
     else
     {
               parent.getChildAt(i).setBackgroundColor(Color.BLACK);
     }

 }

以下に置き換え

int pos = 0;
int save = -1;
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
            //Always set the item clicked blue background
            view.setBackgroundColor(Color.BLUE);

            if (pos == 0) {
                if (save != -1) {
                    parent.getChildAt(save).setBackgroundColor(Color.BLACK);
                }
                save = position;
                pos++;
                Log.d("Pos = 0", "Running");

            } else {
                parent.getChildAt(save).setBackgroundColor(Color.BLACK);
                save = position;
                pos = 0;
                Log.d("Pos # 0", "Running");
            }
2
PrDoHung

List14の例 を見てください。 getView()では、エントリごとにconvertView.setBackgroundDrawable()を呼び出すことができます。クラスメンバーカウンターを使用して、たとえば、交互の背景を取得するために呼び出す背景を決定できます。

1
Heikki Toivonen

これに関する最良のチュートリアルは here にあります。

主なセクション:

  1. onItemClickview.setSelected(true)を必ず呼び出してください。そうでない場合は、選択したアイテムの背景が表示されません
  2. セレクター内の状態の順序を維持します。そうしないと、背景色で予期しない動作が発生します(state_selectedに続いてstate_pressed
1
Mohsen Afshin

あなたはこれを行うことができます。

 final List<String> fruits_list = new ArrayList<String>(Arrays.asList(fruits));

    // Create an ArrayAdapter from List
    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>
            (this, Android.R.layout.simple_list_item_1, fruits_list){
        @Override
        public View getView(int position, View convertView, ViewGroup parent){
            // Get the current item from ListView
            View view = super.getView(position,convertView,parent);
            if(position %2 == 1)
            {
                // Set a background color for ListView regular row/item
                view.setBackgroundColor(Color.parseColor("#FFB6B546"));
            }
            else
            {
                // Set the background color for alternate row/item
                view.setBackgroundColor(Color.parseColor("#FFCCCB4C"));
            }
            return view;
        }
    };

    // DataBind ListView with items from ArrayAdapter
    lv.setAdapter(arrayAdapter);
}

}

1
Fouziya Parveen

リストビューで、必要なAndroid:listselector = color名を追加できます。

これは私のアプリでうまく機能します。

1

Francisco Cabezasのコードを変更することで、次のことがわかりました。

private int selectedRow = -1;

...

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    parent.getChildAt(position).setBackgroundResource(R.color.orange);
    if (selectedRow != -1 && selectedRow != position) {
        parent.getChildAt(selectedRow).setBackgroundResource(R.color.black);
    }
    selectedRow = position;
1
CoolMind

上記のすべての答えを試しました..私のために働いたものはありません。これは最終的に働いたものであり、私のアプリケーションで使用されています。それは両方の状態のリストセレクタースタイルを維持しながら読み取り/未読リストアイテムの色を提供します:

<ListView
                Android:id="@+id/list"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:listSelector="@drawable/selectable_item_background_general"
                Android:drawSelectorOnTop="true"
                Android:fadingEdge="none"
                Android:scrollbarStyle="outsideOverlay"
                Android:choiceMode="singleChoice" />

selectable_item_background_general.xml:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:exitFadeDuration="@Android:integer/config_mediumAnimTime">
    <item Android:state_pressed="false" Android:state_focused="true" Android:drawable="@drawable/bg_item_selected_drawable" />
    <item Android:state_pressed="true" Android:drawable="@drawable/bg_item_selected_drawable" />
    <item Android:drawable="@Android:color/transparent" />
</selector>

bg_item_selected_drawable.xml:

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <solid Android:color="#12000000" />
</shape>

notification_list_itemlayout.xml:

<RelativeLayout 
            xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:id="@+id/rowItemContainer"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content">

    <RelativeLayout 
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:padding="8dp"
        Android:paddingLeft="16dp"
        Android:paddingStart="16dp"
        Android:paddingRight="16dp"
        Android:paddingEnd="16dp">

            <ImageView
                Android:id="@+id/imgViewIcon"
                Android:layout_width="60dp"
                Android:layout_height="60dp"
                Android:src="@drawable/cura_logo_symbol_small"
                Android:layout_alignParentLeft="true"
                Android:layout_alignParentStart="true"
                Android:layout_marginRight="8dp"
                Android:layout_marginEnd="8dp" />
            <TextView
                Android:id="@+id/tvNotificationText"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_alignTop="@+id/imgViewIcon"
                Android:layout_toRightOf="@+id/imgViewIcon"
                Android:layout_toEndOf="@+id/imgViewIcon"
                Android:textSize="@dimen/subtitle"
                Android:textStyle="normal" />
            <TextView
                Android:id="@+id/tvNotificationTime"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="1dip"
                Android:layout_below="@+id/tvNotificationText"
                Android:layout_toRightOf="@+id/imgViewIcon"
                Android:layout_toEndOf="@+id/imgViewIcon"
                Android:textSize="@dimen/subtitle" />
        </RelativeLayout>
</RelativeLayout>

最後に、アダプタで:

if (!Model.Read)
    rowItemContainer.SetBackgroundColor (Android.Graphics.Color.ParseColor ("#FFFDD0")); // unread color
else
    rowItemContainer.SetBackgroundColor (Android.Graphics.Color.White); // read color
0

OnItemClickイベントにsetBackgroundColorが追加された場合、クリックイベントの後に配置できない限り機能しません。

アダプターのgetViewメソッドにデバッグコードを追加しようとすると、画面をクリックするたびにgetViewが再度呼び出されることがわかります。したがって、背景色を設定すると、システムは元の設定で画面を再描画します。クリックされるたびに画面を再構築するためにリソースを浪費する理由がわからない。必要なときに画面を再描画するようにシステムに通知できる他の方法が既にあります。

制御フラグを追加して個々の行の背景色を決定し、getViewメソッドを変更してこの制御フラグに従って色を設定することができます。そのため、画面を再描画するときに背景色が変更されます。

公式の解決策も探しています。

0
Super169