Files
org.ccalm.asdc/app/src/main/java/dbfields/SpinnerDB.java
2023-11-06 11:50:11 +06:00

214 lines
5.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
};
}