天天看點

android Sipnner點選相同Item不響應OnItemSelected事件

原因:

1.下拉清單Sipnner點選相同Item不會響應(也就是spinner的OnItemSelectedListener隻在第一次點選調用,其餘重複點選不再響應)是因為Spinner的父類AbsSpinner的源代碼為:

 voidsetSelectionInt(int position, boolean animate) {

       if (position != mOldSelectedPosition) {

           mBlockLayoutRequests = true;

           int delta  = position -mSelectedPosition;

           setNextSelectedPositionInt(position);

           layout(delta, animate);

           mBlockLayoutRequests = false;

       }

    }

解決辦法:自定義一個Spinner控件,代碼如下:

import android.content.Context;
import android.util.AttributeSet;
import android.widget.Spinner;

public class MySpinner extends Spinner {

	public MySpinner(Context context) {
		super(context);
	}

	public MySpinner(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public MySpinner(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	@Override
	public void setSelection(int position, boolean animate) {
		boolean sameSelected = position == getSelectedItemPosition();
		super.setSelection(position, animate);
		if (sameSelected) {
			getOnItemSelectedListener().onItemSelected(this, getSelectedView(),
					position, getSelectedItemId());
		}
	}

	@Override
	public void setSelection(int position) {
		boolean sameSelected = position == getSelectedItemPosition();
		super.setSelection(position);
		if (sameSelected) {
			getOnItemSelectedListener().onItemSelected(this, getSelectedView(),
					position, getSelectedItemId());
		}
	}
}
           

在自己代碼裡面使用MySpinner控件就可以了