ListView
アイテムの背景色をアイテムごとに変更するにはどうすればよいですか。 ListView
アイテムレイアウトでAndroid:backgroundColor
を使用すると、これを実現できますが、リストセレクターは表示されなくなります。 drawSelectorOnTop
をtrueに設定することでセレクターを再び表示できますが、セレクターはアイテム全体をオーバーレイします。
これらの背景色を変更してセレクターを保持する方法はありますか?
PSセレクター自体を変更したくない。
編集:GMailアプリケーションの作者はこれを正確に達成することができたので、間違いなく可能です。
使用する色ごとに異なる状態ドロアブルを作成する必要があります。
例:list_selector_read.xml
およびlist_selector_unread.xml
。
必要なことは、Android:state_window_focused="false"
アイテムを除くすべてを透明に設定することです。
次に、リストを描画するときに、各行に対してsetBackgroundResource(R.drawable.list_selector_unread/read)
を呼び出します。
ListViewにlistSelectorを設定しないでください。これにより、特定のAndroidフレーバーのデフォルトセレクターが維持されます。
これは、上記のコード、最も単純なコードに基づいた変更です。
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;
}
役に立つと思います
あいさつ!
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!
アダプタを使用してこれを行う例は誰も提供していないようです。そのため、「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;
}
});
リストアイテムの外観を動的に変更する必要がある場合、これは常に私にとって有用なアプローチでした。
最も簡単な方法はこれです。 ListArrayAdapter内でこれを行うだけです
if(your condition here) rowView.setBackgroundColor(Color.parseColor("#20FFFFFF"));
複雑すぎないでください
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);
}
}
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>
これ以上言うことはありません...
アイテムのレイアウトをすべて変更する単純なコード(カスタムリストビューは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);
}
});
カスタムリスト項目をクリックすると、背景色を変更するつもりでしたか?
その場合:
Xmlのリストビューレイアウトに次のコードを追加するだけです。
Android:drawSelectorOnTop = "true" Android:listSelector = "@ Android:drawable/list_selector_background"
ここのリストセレクターは、濃い灰色のデフォルトセレクターを使用します。独自のドロアブルを作成して、上記のようにリストセレクターに割り当てることができます。
これがあなたが望んでいたことを願っています。
実行中の非常にゆっくりした方法
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");
}
List14の例 を見てください。 getView()
では、エントリごとにconvertView.setBackgroundDrawable()
を呼び出すことができます。クラスメンバーカウンターを使用して、たとえば、交互の背景を取得するために呼び出す背景を決定できます。
これに関する最良のチュートリアルは here にあります。
主なセクション:
onItemClick
でview.setSelected(true)
を必ず呼び出してください。そうでない場合は、選択したアイテムの背景が表示されませんstate_selected
に続いてstate_pressed
)あなたはこれを行うことができます。
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);
}
}
リストビューで、必要なAndroid:listselector = color名を追加できます。
これは私のアプリでうまく機能します。
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;
上記のすべての答えを試しました..私のために働いたものはありません。これは最終的に働いたものであり、私のアプリケーションで使用されています。それは両方の状態のリストセレクタースタイルを維持しながら読み取り/未読リストアイテムの色を提供します:
<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
OnItemClickイベントにsetBackgroundColor
が追加された場合、クリックイベントの後に配置できない限り機能しません。
アダプターのgetView
メソッドにデバッグコードを追加しようとすると、画面をクリックするたびにgetViewが再度呼び出されることがわかります。したがって、背景色を設定すると、システムは元の設定で画面を再描画します。クリックされるたびに画面を再構築するためにリソースを浪費する理由がわからない。必要なときに画面を再描画するようにシステムに通知できる他の方法が既にあります。
制御フラグを追加して個々の行の背景色を決定し、getViewメソッドを変更してこの制御フラグに従って色を設定することができます。そのため、画面を再描画するときに背景色が変更されます。
公式の解決策も探しています。