ListView の選択色や文字色のメモ(1)

ListView の選択状態による背景色や文字色のメモ、
特に、BaseAdapter を使い行選択 ClickListner を設定した時に選択色表示が効かなくなるので
カスタマイズ設定する方法
  (長いので2回に分けて投稿)

まずは、背景色の方、、、

リストセレクタと呼ばれるリスト行選択時の背景色を表すリソースを、
  res/color の下に用意する

--- res/color/list_selector.xml の内容 ---

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_selected="false"
         android:state_pressed="false"
         android:drawable="@color/list_unselected" />
   <item android:state_pressed="true"
         android:drawable="@color/list_pressed" />
   <item android:state_selected="true"
         android:state_pressed="false"
         android:drawable="@color/list_selected" />
</selector>
-------------------------------------------
list_selector.xml で指定する @color/xxx が指すものとして
  res/values/colors.xml を用意する。

--- res/values/colors.xml の内容 ----------

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="list_unselected">#000000</color>
    <color name="list_pressed">#ffa122</color>
    <color name="list_selected">#ffa122</color>
</resources>
-------------------------------------------

例として、これを 任意のオブジェクトの List を ListView & BaseAdapter で表示する。
BaseAdapter の getView で返す View で、setBackgroundResource で指定する。

final List<Item> list = getList();

ListView listview = (ListView)findViewById(R.id.listView);
listview.setAdapter(new BaseAdapter(){
   LayoutInflater layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
   @Override
   public View getView(int position, View convertView, ViewGroup parent){

      View view = convertView==null ? layoutInflater.inflate(android.R.layout.simple_list_item_2, null) : convertView;
      final Item item = list.get(position);
      final TextView titleTextView = (TextView)view.findViewById(android.R.id.text1);
      titleTextView.setText(item.get(Item.TEXT1).toString());
      final TextView descriptionTextView = (TextView)view.findViewById(android.R.id.text2);
      descriptionTextView.setText(item.get(Item.TEXT2).toString());
      view.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v){
            titleTextView.setSelected(false);
            startActivity(new Intent(getApplicationContext(), item.getActivity() ));
         }
      });
      view.setBackgroundResource(R.color.list_selector);
      return view;
   }
   @Override
   public long getItemId(int position){
      return position;
   }
   @Override
   public Object getItem(int position){
      return list.get(position);
   }
   @Override
   public int getCount(){
      return list.size();
   }
}
);

上の setOnClickListener で、任意の Activity を起動するサンプルだが、
このままだと、以下のように選択時に背景色の反転しかしない。
文字色はそのままである。

f:id:posturan:20160313225436p:plain



これを以下のようにしたい。

f:id:posturan:20160313225430p:plain



文字色を反転させるためには、ColorStateList TextView に指定するが、
これが2通りある。

続きは、、

ListView の選択色や文字色のメモ(2)で。。。