Первая
This commit is contained in:
213
app/src/main/java/dbfields/SpinnerDB.java
Normal file
213
app/src/main/java/dbfields/SpinnerDB.java
Normal file
@ -0,0 +1,213 @@
|
||||
package dbfields;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.text.Editable;
|
||||
import android.text.SpannableString;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Spinner;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SpinnerDB extends Spinner implements selectDB
|
||||
{
|
||||
private String m_Value = null;
|
||||
private List<String> m_lName = new ArrayList<String>(); //Заголовки
|
||||
private List<String> m_lVal = new ArrayList<String>(); //Значения
|
||||
private Context m_context = null;
|
||||
|
||||
private List<OnClickListener> m_lChange = new ArrayList<OnClickListener>(); //Слушатели изменений
|
||||
|
||||
private OnItemSelectedListener listener = new OnItemSelectedListener()
|
||||
{
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id)
|
||||
{
|
||||
if(getSelectedItemPosition()!=INVALID_POSITION && position != INVALID_POSITION)
|
||||
SpinnerDB.this.setValue(m_lVal.get(getSelectedItemPosition()));
|
||||
}
|
||||
@Override
|
||||
public void onNothingSelected(AdapterView<?> parentView)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Добавить слушателя смены значения (не клика)
|
||||
* @param listener
|
||||
*/
|
||||
public void addOnChangeValueListener(OnClickListener listener)
|
||||
{
|
||||
m_lChange.add(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Удалить слушателя смены значений
|
||||
* @param listener
|
||||
*/
|
||||
public void remOnChangeValueListener(OnClickListener listener)
|
||||
{
|
||||
m_lChange.remove(listener);
|
||||
}
|
||||
|
||||
public SpinnerDB(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context,attrs);
|
||||
m_context = context;
|
||||
setOnItemSelectedListener(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить значение
|
||||
*/
|
||||
public String getValue()
|
||||
{
|
||||
return m_Value;
|
||||
}
|
||||
|
||||
/** Присвоить значение полю и попытаться найти его в выподающем списке*/
|
||||
public void setValue(String value)
|
||||
{
|
||||
if(m_Value == value) return;
|
||||
m_Value = value;
|
||||
|
||||
updatePosition();
|
||||
|
||||
//Информируем слушателей о изменении значении
|
||||
for(int i=0;i<m_lChange.size();i++)
|
||||
{ m_lChange.get(i).onClick(getEmptyView());
|
||||
}
|
||||
}
|
||||
|
||||
public void addField(String name, String val)
|
||||
{
|
||||
m_lName.add(name);
|
||||
m_lVal.add(val);
|
||||
|
||||
//Обновляем список
|
||||
setOnItemSelectedListener(null); //Чтоб событие не сработало
|
||||
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(m_context, android.R.layout.simple_spinner_item, m_lName);
|
||||
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
this.setAdapter(dataAdapter);
|
||||
setOnItemSelectedListener(listener);
|
||||
|
||||
updatePosition(); //Чтоб установилось на существующее значение если оно есть
|
||||
}
|
||||
|
||||
public void clearFields()
|
||||
{
|
||||
m_lName.clear();
|
||||
m_lVal.clear();
|
||||
|
||||
//Обновляем список
|
||||
setOnItemSelectedListener(null);
|
||||
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(m_context, android.R.layout.simple_spinner_item, m_lName);
|
||||
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
this.setAdapter(dataAdapter);
|
||||
setOnItemSelectedListener(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Обновить позицию вып списка в соответствии со значением
|
||||
*/
|
||||
protected void updatePosition()
|
||||
{
|
||||
Boolean b=true;
|
||||
for(int i=0;i<m_lVal.size();i++)
|
||||
{
|
||||
if(m_lVal.get(i).equals(m_Value))
|
||||
{
|
||||
setSelection(i);
|
||||
b=false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(b) setSelection(INVALID_POSITION);
|
||||
}
|
||||
|
||||
// Return the currently selected title (not a value)
|
||||
public Editable getText(){
|
||||
String result="";
|
||||
for(int i=0;i<m_lVal.size();i++)
|
||||
{
|
||||
if(m_lVal.get(i).equals(m_Value))
|
||||
{
|
||||
result=m_lName.get(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return new SpannableStringBuilder(result);
|
||||
}
|
||||
|
||||
public void setOnChangeValueListener(View.OnClickListener listener){
|
||||
this.addOnChangeValueListener(listener);
|
||||
}
|
||||
|
||||
// Класс для сохранения изменений сделаных пользователем при повороте экрана
|
||||
public static class SavedStateSPNR extends BaseSavedState
|
||||
{
|
||||
String value = ""; //Не может быть null почемуто вылетает!
|
||||
|
||||
SavedStateSPNR(Parcelable superState)
|
||||
{
|
||||
super(superState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel out, int flags)
|
||||
{
|
||||
super.writeToParcel(out, flags);
|
||||
out.writeString(value);
|
||||
}
|
||||
|
||||
public static final Parcelable.Creator<SavedStateSPNR> CREATOR = new Parcelable.Creator<SavedStateSPNR>()
|
||||
{
|
||||
public SavedStateSPNR createFromParcel(Parcel in)
|
||||
{
|
||||
return new SavedStateSPNR(in);
|
||||
}
|
||||
|
||||
public SavedStateSPNR[] newArray(int size)
|
||||
{
|
||||
return new SavedStateSPNR[size];
|
||||
}
|
||||
};
|
||||
|
||||
private SavedStateSPNR(Parcel in)
|
||||
{
|
||||
super(in);
|
||||
value = in.readString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Parcelable onSaveInstanceState()
|
||||
{
|
||||
SavedStateSPNR st = new SavedStateSPNR(super.onSaveInstanceState());
|
||||
st.value = getValue();
|
||||
if(st.value==null) st.value="";
|
||||
return st;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRestoreInstanceState(Parcelable state)
|
||||
{
|
||||
if (state == null || !(state instanceof SavedStateSPNR))
|
||||
{
|
||||
super.onRestoreInstanceState(state);
|
||||
return;
|
||||
}
|
||||
|
||||
SavedStateSPNR ss = (SavedStateSPNR) state;
|
||||
super.onRestoreInstanceState(ss.getSuperState());
|
||||
setValue(ss.value);
|
||||
};
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user