AndroidでListViewの選択したItemの背景色を設定


ListViewにはデフォルトの選択色はなく、Itemを選択した後のフォーカス色だけで、マウスクリック時にItemに色があり、マウスを離すと色がなくなり、マウスを離した後の選択項目を実現する背景には色があります.
 
  
 
   
 
1、mainを配置する.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<ListView android:id="@+id/listView" android:listSelector="#000000"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content" />
</LinearLayout>

 
Itemの取得フォーカスカラーを白に設定するandroid:listSelector=「#00000」(背景色を表示しない)
 
2.ListViewにItemを表示するためのbutton_を設定するlayout.xml
 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/LinearLayoutButton"
  android:layout_width="144px"
  android:layout_height="99px"
  android:gravity="center"
  android:orientation="vertical">
  
	
	<TextView 
		android:id="@+id/TextViewButton" 
		android:layout_width="fill_parent" 
		android:layout_height="fill_parent"
		android:textSize="20px">
	</TextView>
	
	
</LinearLayout>

 
 
3、Activityの実現
 
 
package com.listButtonTest.www;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

public class listButtonTest extends Activity {
	private ListView listView = null;
	private ListAdapter listAdapter = null;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		listView = (ListView) this.findViewById(R.id.listView);
		ArrayList<ButtonView> buttonListView = new ArrayList<ButtonView>();
		ButtonView a = new ButtonView(R.string.l1);
		buttonListView.add(a);
		ButtonView b = new ButtonView(R.string.l2);
		buttonListView.add(b);
		ButtonView c = new ButtonView(R.string.l3);
		buttonListView.add(c);
		ButtonView d = new ButtonView(R.string.l4);
		buttonListView.add(d);
		ButtonView e = new ButtonView(R.string.l5);
		buttonListView.add(e);

		listAdapter = new ListAdapter(buttonListView);
		listView.setAdapter(listAdapter);
		listView.setDividerHeight(0);

		listView.setOnItemClickListener(new ListView.OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				// TODO Auto-generated method stub
				listAdapter.setSelectedPosition(arg2);
				 
				listAdapter.notifyDataSetInvalidated();   

			}
		});
	};

 

	public class ListAdapter extends BaseAdapter {

		ArrayList<ButtonView> arrayList = null;
		LayoutInflater inflater;
		View view;
		ButtonLayoutHolder buttonLayoutHolder;
		LinearLayout buttonLayout = null;
		TextView buttonText = null;

		private int selectedPosition = -1;//      

		public ListAdapter(ArrayList<ButtonView> buttonListView) {
			// TODO Auto-generated constructor stub
			arrayList = buttonListView;
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return arrayList.size();
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return arrayList.get(position);
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		public void setSelectedPosition(int position) {
			selectedPosition = position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			view = inflater.inflate(R.layout.button_layout, null, false);
			buttonLayoutHolder = (ButtonLayoutHolder) view.getTag();

			if (buttonLayoutHolder == null) {
				buttonLayoutHolder = new ButtonLayoutHolder();
				buttonLayoutHolder.buttonLayout = (LinearLayout) view
						.findViewById(R.id.LinearLayoutButton);
				buttonLayoutHolder.textView = (TextView) view
						.findViewById(R.id.TextViewButton);
				view.setTag(buttonLayoutHolder);
			}
			buttonLayout = buttonLayoutHolder.buttonLayout;
			buttonText = buttonLayoutHolder.textView;
			if (selectedPosition == position) {
				buttonText.setSelected(true);
				buttonText.setPressed(true);
				buttonLayout.setBackgroundColor(Color.RED);
			} else {
				buttonText.setSelected(false);
				buttonText.setPressed(false);
				buttonLayout.setBackgroundColor(Color.TRANSPARENT);   

			}

			buttonText.setTextColor(Color.WHITE);
			buttonText.setText(arrayList.get(position).textViewId);

			return view;

		}

	};

}

class ButtonView {
	int textViewId;

	ButtonView(int tId) {
		textViewId = tId;
	}
}

class ButtonLayoutHolder {
	LinearLayout buttonLayout;
	TextView textView;
}

 
 
listViewのsetOnItemClickListenerイベントで今回選択したItemの下付きラベルをマーク:listAdapter.setSelectedPosition(arg2);
 
次にlistAdapterを呼び出します.notifyDataSetInvalidated()は、バックグラウンドにインタフェースの再リフレッシュを通知します.
 
ListAdapterのgetView()メソッドでは、選択したItemであれば背景色が表示され、そうでなければ背景色が表示されません.