ページ

2013/08/14

[Android]ListViewのitem毎に有効/無効を設定する

あまり需要はないかと思いますが、
ListView の item 毎に有効/無効を
設定する方法を知ったので
書いておこうと思います。

右のスクリーンショットは僕の開発した
DevCamera のカメラ選択画面です。
複数のカメラを使用することができますが、
初期状態では通常カメラのみを使用できるようにしたくなかったので
それ以外は無効化(グレーアウト)しています。

このように item 毎に有効/無効を設定するには
BaseAdapter の isEnabled メソッドをオーバーライドして
item 毎に true/false を返してやれば良いです。
BaseAdapter#isEnabled(int) | Android Developers

DevCamera では CameraItem クラスのコンストラクタで
enabled を設定して、下のハイライトしている行で返しています。

下のサンプルは ListView の item 毎に有効/無効を設定する部分と
無効化した item のグレーアウトの処理の部分以外を
適当に省略したコードです。
public class CameraItem {

    int      colorId;
    boolean  enabled;

    public int getColorId(){
        return enabled ? colorId : R.color.darkGray;
    }

    public boolean isEnabled(){
        return enabled;
    }

}

public class CameraListAdapter extends ArrayAdapter<CameraItem> {

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        View view;
        if(convertView == null){
            view = mLayoutInflater.inflate(R.layout.fragment_camera_list_row, parent, false);
        }else{
            view = convertView;
        }
        CameraItem item = getItem(position);
        ImageView icon = (ImageView)view.findViewById(R.id.icon);
        icon.setImageResource(item.getIconId());
        icon.setColorFilter(getContext().getResources().getColor(item.getColorId())));
        TextView title = (TextView)view.findViewById(R.id.title);
        title.setText(item.getTitleId());
        if(item.isEnabled()){
            title.setTypeface(Typeface.DEFAULT_BOLD);
        }else{
            title.setTextColor(getContext().getResources().getColor(R.color.darkGray));
        }
        return view;
    }

    @Override
    public boolean isEnabled(int position){
        return getItem(position).isEnabled();
    }

}