10

とても単純に聞こえると思いますが、これについては疑問があります。しかし、どれも私の問題を解決できませんでした。だからここに行きます:

ユーザーがクリックしたときにリスト項目の背景色を変更しListActivity、ユーザーが再度クリックしたときに元の色に戻したい (つまり、項目の選択/選択解除の外観)

getChildAt を使用してみました。スクロールせずにすべての項目を 1 つの画面に表示すると、完全に機能します。

コード:

getListView().getChildAt(position).setBackgroundColor(Color.CYAN);

問題は、リストにさらに項目があり、ユーザーがそれらをスクロールする必要があるときに始まります。アイテムの背景が変更されると、スクロールすると、新しく表示されるアイテムに背景色が表示されます。また、アイテムをもう一度クリックすると、 がgetChildAt(position)返されますnull(したがって、も返されます)。NullPointerException

リスト項目の背景色を変更するのに役立つ簡単なコードを教えてください。

前もって感謝します!

4

6 に答える 6

5

確実なこと。私はこれをgetView()カスタムの方法で行いますListAdapter

MyAdapter extends SimpleAdapter {
    private ArrayList<Integer> coloredItems = new ArrayList<Integer>();

    public MyAdapter(...) {
        super(...);
    }

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

        if (coloredItems.contains(position)) {
            v.setBackgroundColor(Color.CYAN);
        } else {
            v.setBackgroundColor(Color.BLACK); //or whatever was original
        }

        return v;
    }
}

coloredItemsリストアイテムがクリックされたときに更新します。

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    if (coloredItems.contains(position)) {
        //remove position from coloredItems
        v.setBackgroundColor(Color.BLACK); //or whatever was original
    } else {
        //add position to coloredItems
        v.setBackgroundColor(Color.CYAN);
    }
}
于 2012-09-26T21:36:43.790 に答える
1

onListItemClickメソッドでこのようにするだけです

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    for (int a = 0; a < l.getChildCount(); a++) {
        l.getChildAt(a).setBackgroundColor(Color.TRANSPARENT);
    }

    ColorDrawable colorDrawable1 = new ColorDrawable(
            Color.parseColor("#A0A3A0"));
    v.setBackgroundDrawable(colorDrawable1);   

    if (position == 0) {
        Intent i = new Intent(MainActivity.this, NewActivity.class);

        startActivity(i);
    }

}
于 2014-12-18T10:17:45.420 に答える
1

私がしていることは、つまり list_background という名前の xml ファイルを作成し、それを drawable フォルダーに配置することです。

xml は次のようになります。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:drawable="@color/list_selected" android:state_pressed="true" />
   <item android:drawable="@android:color/white" />
</selector>

そして、ListViewのアイテムのxmlコードでは、このxmlをアイテムの背景として配置します。

item.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          style="@style/Fill"
          android:background="@drawable/list_background">

     <!-- Your layout here -->
</RelativeLayout>

style=@style/Fill は、android:layout_height="match_parent" および android:layout_width="match_parent 用に作成したショートカットにすぎません

次に、onListItemCLick で:

public void onListItemClick(ListView l, View v, int position, long id) {
    v.setPressed( !v.isPressed ) //Toggle between colors of the view
}
于 2012-09-26T21:39:24.310 に答える
0

これが私がやった方法です:

グローバル変数を作成しますView ColoredView。次に、 の場合は、次のようにsetOnItemClickListenerしますListView

MenuList.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (ColoredView != null)
                    ColoredView.setBackgroundColor(Color.WHITE); //original color

                view.setBackgroundColor(Color.BLUE); //selected color
                ColoredView = view;
            }
        });

それは私の意見では最も簡単な方法です。

于 2013-04-02T05:30:13.283 に答える
0

ありがとうヘイコスモ。あなたの解決策は私の問題を解決しました。

背景を 2 か所に設定する理由がわかりません。

1.アダプタの getView()

@Override
public View getView(int position, View convertView, ViewGroup parent) {
     ....
     ....
     ....
        if(arrayBools[position]) {
            view.setBackgroundColor(Common.colorBkgroundSelected);
        }
        else{
            view.setBackgroundColor(Common.colorBkgroundNormal);            
        } 
     ....
     ....
     ....
}

2. ListActivity の onListItemClick()。

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
      super.onListItemClick(l, v, position, id);       
      arrayBools[position] = ( arrayBools[position] ? false : true );

     if(arrayBools[position]) {
         v.setBackgroundColor(colorBkgroundSelected);
     }
     else{
        v.setBackgroundColor(colorBkgroundNormal);          
     }    
}
于 2013-12-20T10:04:59.543 に答える