Add new changes GeoFencing-GeoTaging and hide Manual Inword Option etc

This commit is contained in:
Jeevan Prasad
2025-06-26 15:10:22 +05:30
commit 917fee86de
2254 changed files with 218226 additions and 0 deletions
+9
View File
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.androidbuts.multispinnerfilter" >
<application android:allowBackup="true">
</application>
</manifest>
@@ -0,0 +1,89 @@
package com.androidbuts.multispinnerfilter;
import java.io.Serializable;
public class KeyPairBoolData implements Serializable {
long id;
String name;
boolean isSelected;
String merCd;
Object object;
String answerCd;
String answer;
public String getAnswerCd() {
return answerCd;
}
public void setAnswerCd(String answerCd) {
this.answerCd = answerCd;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
public String getMerCd() {
return merCd;
}
public void setMerCd(String merCd) {
this.merCd = merCd;
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
/**
* @return the id
*/
public long getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(long id) {
this.id = id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the isSelected
*/
public boolean isSelected() {
return isSelected;
}
/**
* @param isSelected the isSelected to set
*/
public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
}
}
@@ -0,0 +1,121 @@
package com.androidbuts.multispinnerfilter;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.content.res.TypedArray;
import androidx.appcompat.widget.AppCompatSpinner;
import android.util.AttributeSet;
import android.widget.ArrayAdapter;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
public class MultiSpinner extends AppCompatSpinner implements OnMultiChoiceClickListener, OnCancelListener {
private List<String> items;
private boolean[] selected;
private String defaultText = "Select Items";
private String spinnerTitle = "";
private MultiSpinnerListener listener;
public MultiSpinner(Context context) {
super(context);
}
public MultiSpinner(Context arg0, AttributeSet arg1) {
super(arg0, arg1);
TypedArray a = arg0.obtainStyledAttributes(arg1, R.styleable.MultiSpinnerSearch);
final int N = a.getIndexCount();
for (int i = 0; i < N; ++i) {
int attr = a.getIndex(i);
if (attr == R.styleable.MultiSpinnerSearch_hintText) {
spinnerTitle = a.getString(attr);
}
}
a.recycle();
}
public MultiSpinner(Context arg0, AttributeSet arg1, int arg2) {
super(arg0, arg1, arg2);
}
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
selected[which] = isChecked;
}
@Override
public void onCancel(DialogInterface dialog) {
// refresh text on spinner
StringBuilder spinnerBuffer = new StringBuilder();
for (int i = 0; i < items.size(); i++) {
if (selected[i]) {
spinnerBuffer.append(items.get(i));
spinnerBuffer.append(", ");
}
}
String spinnerText = spinnerBuffer.toString();
if (spinnerText.length() > 2) {
spinnerText = spinnerText.substring(0, spinnerText.length() - 2);
} else {
spinnerText = defaultText;
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), R.layout.textview_for_spinner, new String[]{spinnerText});
setAdapter(adapter);
if (selected.length > 0) {
listener.onItemsSelected(selected);
}
}
@Override
public boolean performClick() {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext(), R.style.myDialog);
builder.setTitle(spinnerTitle);
builder.setMultiChoiceItems(
items.toArray(new CharSequence[items.size()]), selected, this);
builder.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.setOnCancelListener(this);
builder.show();
return true;
}
/**
* Sets items to this spinner.
*
* @param items A TreeMap where the keys are the values to display in the spinner
* and the value the initial selected state of the key.
* @param listener A MultiSpinnerListener.
*/
public void setItems(LinkedHashMap<String, Boolean> items, MultiSpinnerListener listener) {
this.items = new ArrayList<>(items.keySet());
this.listener = listener;
List<Boolean> values = new ArrayList<>(items.values());
selected = new boolean[values.size()];
for (int i = 0; i < items.size(); i++) {
selected[i] = values.get(i);
}
// all text on the spinner
ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), R.layout.textview_for_spinner, new String[]{defaultText});
setAdapter(adapter);
// Set Spinner Text
onCancel(null);
}
}
@@ -0,0 +1,5 @@
package com.androidbuts.multispinnerfilter;
public interface MultiSpinnerListener {
void onItemsSelected(boolean[] selected);
}
@@ -0,0 +1,342 @@
package com.androidbuts.multispinnerfilter;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Typeface;
import androidx.core.content.ContextCompat;
import androidx.appcompat.widget.AppCompatSpinner;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MultiSpinnerSearch extends AppCompatSpinner implements OnCancelListener {
private static final String TAG = MultiSpinnerSearch.class.getSimpleName();
private List<KeyPairBoolData> items;
private String defaultText = "";
private String spinnerTitle = "";
private SpinnerListener listener;
private int limit = -1;
private int selected = 0;
private LimitExceedListener limitListener;
MyAdapter adapter;
public static AlertDialog.Builder builder;
public static AlertDialog ad;
public MultiSpinnerSearch(Context context) {
super(context);
}
public MultiSpinnerSearch(Context arg0, AttributeSet arg1) {
super(arg0, arg1);
TypedArray a = arg0.obtainStyledAttributes(arg1, R.styleable.MultiSpinnerSearch);
for (int i = 0; i < a.getIndexCount(); ++i) {
int attr = a.getIndex(i);
if (attr == R.styleable.MultiSpinnerSearch_hintText) {
spinnerTitle = a.getString(attr);
defaultText = spinnerTitle;
break;
}
}
Log.i(TAG, "spinnerTitle: "+spinnerTitle);
a.recycle();
}
public MultiSpinnerSearch(Context arg0, AttributeSet arg1, int arg2) {
super(arg0, arg1, arg2);
}
public void setLimit(int limit, LimitExceedListener listener) {
this.limit = limit;
this.limitListener = listener;
}
public List<KeyPairBoolData> getSelectedItems() {
List<KeyPairBoolData> selectedItems = new ArrayList<>();
for(KeyPairBoolData item : items){
if(item.isSelected()){
selectedItems.add(item);
}
}
return selectedItems;
}
public List<Long> getSelectedIds() {
List<Long> selectedItemsIds = new ArrayList<>();
for(KeyPairBoolData item : items){
if(item.isSelected()){
selectedItemsIds.add(item.getId());
}
}
return selectedItemsIds;
}
@Override
public void onCancel(DialogInterface dialog) {
// refresh text on spinner
StringBuilder spinnerBuffer = new StringBuilder();
for (int i = 0; i < items.size(); i++) {
if (items.get(i).isSelected()) {
spinnerBuffer.append(items.get(i).getName());
spinnerBuffer.append(", ");
}
}
String spinnerText = spinnerBuffer.toString();
if (spinnerText.length() > 2)
spinnerText = spinnerText.substring(0, spinnerText.length() - 2);
else
spinnerText = defaultText;
ArrayAdapter<String> adapterSpinner = new ArrayAdapter<>(getContext(), R.layout.textview_for_spinner, new String[]{spinnerText});
setAdapter(adapterSpinner);
if (adapter != null)
adapter.notifyDataSetChanged();
listener.onItemsSelected(items);
}
@Override
public boolean performClick() {
builder = new AlertDialog.Builder(getContext(), R.style.myDialog);
builder.setTitle(spinnerTitle);
builder.setCancelable(false);
final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View view = inflater.inflate(R.layout.alert_dialog_listview_search, null);
builder.setView(view);
final ListView listView = (ListView) view.findViewById(R.id.alertSearchListView);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
listView.setFastScrollEnabled(false);
adapter = new MyAdapter(getContext(), items);
listView.setAdapter(adapter);
final TextView emptyText = (TextView) view.findViewById(R.id.empty);
listView.setEmptyView(emptyText);
final EditText editText = (EditText) view.findViewById(R.id.alertSearchEditText);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.i(TAG, " ITEMS : " + items.size());
dialog.cancel();
}
});
builder.setOnCancelListener(this);
ad = builder.show();
return true;
}
public void setItems(List<KeyPairBoolData> items, int position, SpinnerListener listener) {
this.items = items;
this.listener = listener;
StringBuilder spinnerBuffer = new StringBuilder();
for (int i = 0; i < items.size(); i++) {
if (items.get(i).isSelected()) {
spinnerBuffer.append(items.get(i).getName());
spinnerBuffer.append(", ");
}
}
if (spinnerBuffer.length() > 2) {
defaultText = spinnerBuffer.toString().substring(0, spinnerBuffer.toString().length() - 2);
}else{
defaultText = "";
}
ArrayAdapter<String> adapterSpinner = new ArrayAdapter<>(getContext(), R.layout.textview_for_spinner, new String[]{defaultText});
setAdapter(adapterSpinner);
if (position != -1) {
items.get(position).setSelected(true);
onCancel(null);
}
}
public interface LimitExceedListener {
void onLimitListener(KeyPairBoolData data);
}
//Adapter Class
public class MyAdapter extends BaseAdapter implements Filterable {
List<KeyPairBoolData> arrayList;
List<KeyPairBoolData> mOriginalValues; // Original Values
LayoutInflater inflater;
public MyAdapter(Context context, List<KeyPairBoolData> arrayList) {
this.arrayList = arrayList;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return arrayList.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
private class ViewHolder {
TextView textView;
CheckBox checkBox;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
Log.i(TAG, "getView() enter");
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.item_listview_multiple, parent, false);
holder.textView = (TextView) convertView.findViewById(R.id.alertTextView);
holder.checkBox = (CheckBox) convertView.findViewById(R.id.alertCheckbox);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final int backgroundColor = (position%2 == 0) ? R.color.list_even : R.color.list_odd;
convertView.setBackgroundColor(ContextCompat.getColor(getContext(), backgroundColor));
final KeyPairBoolData data = arrayList.get(position);
holder.textView.setText(data.getName());
holder.textView.setTypeface(null, Typeface.NORMAL);
holder.checkBox.setChecked(data.isSelected());
convertView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(data.isSelected()) { // deselect
selected--;
} else if(selected == limit) { // select with limit
if(limitListener != null)
limitListener.onLimitListener(data);
return;
} else { // selected
selected++;
}
final ViewHolder temp = (ViewHolder) v.getTag();
temp.checkBox.setChecked(!temp.checkBox.isChecked());
data.setSelected(!data.isSelected());
Log.i(TAG, "On Click Selected Item : " + data.getName() + " : " + data.isSelected());
notifyDataSetChanged();
}
});
if (data.isSelected()) {
holder.textView.setTypeface(null, Typeface.BOLD);
holder.textView.setTextColor(Color.WHITE);
convertView.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.list_selected));
}
holder.checkBox.setTag(holder);
return convertView;
}
@SuppressLint("DefaultLocale")
@Override
public Filter getFilter() {
return new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
arrayList = (List<KeyPairBoolData>) results.values; // has the filtered values
notifyDataSetChanged(); // notifies the data with new filtered values
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults(); // Holds the results of a filtering operation in values
List<KeyPairBoolData> FilteredArrList = new ArrayList<>();
if (mOriginalValues == null) {
mOriginalValues = new ArrayList<>(arrayList); // saves the original data in mOriginalValues
}
/********
*
* If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values
* else does the Filtering and returns FilteredArrList(Filtered)
*
********/
if (constraint == null || constraint.length() == 0) {
// set the Original result to return
results.count = mOriginalValues.size();
results.values = mOriginalValues;
} else {
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < mOriginalValues.size(); i++) {
Log.i(TAG, "Filter : " + mOriginalValues.get(i).getName() + " -> " + mOriginalValues.get(i).isSelected());
String data = mOriginalValues.get(i).getName();
if (data.toLowerCase().contains(constraint.toString())) {
FilteredArrList.add(mOriginalValues.get(i));
}
}
// set the Filtered result to return
results.count = FilteredArrList.size();
results.values = FilteredArrList;
}
return results;
}
};
}
}
}
@@ -0,0 +1,243 @@
package com.androidbuts.multispinnerfilter;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Typeface;
import androidx.core.content.ContextCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class SingleSpinner extends androidx.appcompat.widget.AppCompatSpinner implements OnCancelListener {
private static final String TAG = SingleSpinner.class.getSimpleName();
private List<KeyPairBoolData> items;
private String defaultText = "";
private String spinnerTitle = "";
private SpinnerListener listener;
MyAdapter adapter;
public static AlertDialog.Builder builder;
public static AlertDialog ad;
public SingleSpinner(Context context) {
super(context);
}
public SingleSpinner(Context arg0, AttributeSet arg1) {
super(arg0, arg1);
TypedArray a = arg0.obtainStyledAttributes(arg1, R.styleable.MultiSpinnerSearch);
final int N = a.getIndexCount();
for (int i = 0; i < N; ++i) {
int attr = a.getIndex(i);
if (attr == R.styleable.MultiSpinnerSearch_hintText) {
spinnerTitle = a.getString(attr);
defaultText = spinnerTitle;
break;
}
}
Log.i(TAG, "spinnerTitle: "+spinnerTitle);
a.recycle();
}
public SingleSpinner(Context arg0, AttributeSet arg1, int arg2) {
super(arg0, arg1, arg2);
}
public List<KeyPairBoolData> getSelectedItems() {
List<KeyPairBoolData> selectedItems = new ArrayList<>();
for(KeyPairBoolData item : items){
if(item.isSelected()){
selectedItems.add(item);
}
}
return selectedItems;
}
public List<Long> getSelectedIds() {
List<Long> selectedItemsIds = new ArrayList<>();
for(KeyPairBoolData item : items){
if(item.isSelected()){
selectedItemsIds.add(item.getId());
}
}
return selectedItemsIds;
}
@Override
public void onCancel(DialogInterface dialog) {
// refresh text on spinner
String spinnerText = null;
for (int i = 0; i < items.size(); i++) {
if (items.get(i).isSelected()) {
spinnerText = items.get(i).getName();
break;
}
}
if (spinnerText==null){
spinnerText = defaultText;
}
ArrayAdapter<String> adapterSpinner = new ArrayAdapter<>(getContext(), R.layout.textview_for_spinner, new String[] { spinnerText });
setAdapter(adapterSpinner);
if(adapter != null)
adapter.notifyDataSetChanged();
listener.onItemsSelected(items);
}
@Override
public boolean performClick() {
builder = new AlertDialog.Builder(getContext(), R.style.myDialog);
builder.setTitle(spinnerTitle);
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE );
View view = inflater.inflate(R.layout.alert_dialog_listview_search, null);
builder.setView(view);
final ListView listView = (ListView) view.findViewById(R.id.alertSearchListView);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
listView.setFastScrollEnabled(false);
adapter = new MyAdapter(getContext(), items);
listView.setAdapter(adapter);
final TextView emptyText = (TextView) view.findViewById(R.id.empty);
listView.setEmptyView(emptyText);
EditText editText = (EditText) view.findViewById(R.id.alertSearchEditText);
editText.setVisibility(GONE);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.i(TAG, " ITEMS : " + items.size() );
dialog.cancel();
}
});
builder.setOnCancelListener(this);
ad = builder.show();
return true;
}
public void setItems(List<KeyPairBoolData> items, int position, SpinnerListener listener) {
this.items = items;
this.listener = listener;
for (KeyPairBoolData item : items){
if(item.isSelected()){
defaultText = item.getName();
break;
}
}
ArrayAdapter<String> adapterSpinner = new ArrayAdapter<>(getContext(), R.layout.textview_for_spinner, new String[] { defaultText });
setAdapter(adapterSpinner);
if(position != -1)
{
items.get(position).setSelected(true);
//listener.onItemsSelected(items);
onCancel(null);
}
}
//Adapter Class
public class MyAdapter extends BaseAdapter{
List<KeyPairBoolData> arrayList;
LayoutInflater inflater;
public MyAdapter(Context context, List<KeyPairBoolData> arrayList) {
this.arrayList = arrayList;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return arrayList.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
private class ViewHolder {
TextView textView;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
Log.i(TAG, "getView() enter");
ViewHolder holder = new ViewHolder();
convertView = inflater.inflate(R.layout.item_listview_single, parent, false);
holder.textView = (TextView) convertView.findViewById(R.id.alertTextView);
convertView.setTag(holder);
if(position%2==0){
convertView.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.list_even));
}else{
convertView.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.list_odd));
}
final KeyPairBoolData data = arrayList.get(position);
holder.textView.setText(data.getName());
holder.textView.setTypeface(null, Typeface.NORMAL);
convertView.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
int len = arrayList.size();
for (int i = 0; i < len; i++)
{
arrayList.get(i).setSelected(false);
if (i == position)
{
arrayList.get(i).setSelected(true);
Log.i(TAG, "On Click Selected Item : " + arrayList.get(i).getName() + " : " + arrayList.get(i).isSelected());
}
}
ad.dismiss();
SingleSpinner.this.onCancel(ad);
}
});
if(data.isSelected()){
holder.textView.setTypeface(null, Typeface.BOLD);
holder.textView.setTextColor(Color.WHITE);
convertView.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.list_selected));
}
return convertView;
}
}
}
@@ -0,0 +1,320 @@
package com.androidbuts.multispinnerfilter;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Typeface;
import androidx.core.content.ContextCompat;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class SingleSpinnerSearch extends androidx.appcompat.widget.AppCompatSpinner implements OnCancelListener {
private static final String TAG = SingleSpinnerSearch.class.getSimpleName();
private List<KeyPairBoolData> items;
private String defaultText = "";
private String spinnerTitle = "";
private SpinnerListener listener;
MyAdapter adapter;
public static AlertDialog.Builder builder;
public static AlertDialog ad;
public SingleSpinnerSearch(Context context) {
super(context);
}
public SingleSpinnerSearch(Context arg0, AttributeSet arg1) {
super(arg0, arg1);
TypedArray a = arg0.obtainStyledAttributes(arg1, R.styleable.MultiSpinnerSearch);
final int N = a.getIndexCount();
for (int i = 0; i < N; ++i) {
int attr = a.getIndex(i);
if (attr == R.styleable.MultiSpinnerSearch_hintText) {
spinnerTitle = a.getString(attr);
defaultText = spinnerTitle;
break;
}
}
Log.i(TAG, "spinnerTitle: "+spinnerTitle);
a.recycle();
}
public SingleSpinnerSearch(Context arg0, AttributeSet arg1, int arg2) {
super(arg0, arg1, arg2);
}
public List<KeyPairBoolData> getSelectedItems() {
List<KeyPairBoolData> selectedItems = new ArrayList<>();
for(KeyPairBoolData item : items){
if(item.isSelected()){
selectedItems.add(item);
}
}
return selectedItems;
}
public List<Long> getSelectedIds() {
List<Long> selectedItemsIds = new ArrayList<>();
for(KeyPairBoolData item : items){
if(item.isSelected()){
selectedItemsIds.add(item.getId());
}
}
return selectedItemsIds;
}
@Override
public void onCancel(DialogInterface dialog) {
// refresh text on spinner
String spinnerText = null;
for (int i = 0; i < items.size(); i++) {
if (items.get(i).isSelected()) {
spinnerText = items.get(i).getName();
break;
}
}
if (spinnerText==null){
spinnerText = defaultText;
}
ArrayAdapter<String> adapterSpinner = new ArrayAdapter<>(getContext(), R.layout.textview_for_spinner, new String[] { spinnerText });
setAdapter(adapterSpinner);
if(adapter != null)
adapter.notifyDataSetChanged();
listener.onItemsSelected(items);
}
@Override
public boolean performClick() {
builder = new AlertDialog.Builder(getContext(), R.style.myDialog);
builder.setTitle(spinnerTitle);
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE );
View view = inflater.inflate(R.layout.alert_dialog_listview_search, null);
builder.setView(view);
final ListView listView = (ListView) view.findViewById(R.id.alertSearchListView);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
listView.setFastScrollEnabled(false);
adapter = new MyAdapter(getContext(), items);
listView.setAdapter(adapter);
for(int i =0;i<items.size();i++){
if(items.get(i).isSelected()){
listView.setSelection(i);
break;
}
}
final TextView emptyText = (TextView) view.findViewById(R.id.empty);
listView.setEmptyView(emptyText);
EditText editText = (EditText) view.findViewById(R.id.alertSearchEditText);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.i(TAG, " ITEMS : " + items.size() );
dialog.cancel();
}
});
builder.setOnCancelListener(this);
ad = builder.show();
return true;
}
public void setItems(List<KeyPairBoolData> items, int position, SpinnerListener listener) {
this.items = items;
this.listener = listener;
for (KeyPairBoolData item : items){
if(item.isSelected()){
defaultText = item.getName();
break;
}
}
ArrayAdapter<String> adapterSpinner = new ArrayAdapter<>(getContext(), R.layout.textview_for_spinner, new String[] { defaultText });
setAdapter(adapterSpinner);
if(position != -1)
{
items.get(position).setSelected(true);
//listener.onItemsSelected(items);
onCancel(null);
}
}
//Adapter Class
public class MyAdapter extends BaseAdapter implements Filterable {
List<KeyPairBoolData> arrayList;
List<KeyPairBoolData> mOriginalValues; // Original Values
LayoutInflater inflater;
public MyAdapter(Context context, List<KeyPairBoolData> arrayList) {
this.arrayList = arrayList;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return arrayList.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
private class ViewHolder {
TextView textView;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
Log.i(TAG, "getView() enter");
ViewHolder holder = new ViewHolder();
convertView = inflater.inflate(R.layout.item_listview_single, parent, false);
holder.textView = (TextView) convertView.findViewById(R.id.alertTextView);
convertView.setTag(holder);
if(position%2==0){
convertView.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.list_even));
}else{
convertView.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.list_odd));
}
final KeyPairBoolData data = arrayList.get(position);
holder.textView.setText(data.getName());
holder.textView.setTypeface(null, Typeface.NORMAL);
convertView.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
int len = arrayList.size();
for (int i = 0; i < len; i++)
{
arrayList.get(i).setSelected(false);
if (i == position)
{
arrayList.get(i).setSelected(true);
Log.i(TAG, "On Click Selected Item : " + arrayList.get(i).getName() + " : " + arrayList.get(i).isSelected());
}
}
ad.dismiss();
SingleSpinnerSearch.this.onCancel(ad);
}
});
if(data.isSelected()){
holder.textView.setTypeface(null, Typeface.BOLD);
holder.textView.setTextColor(Color.WHITE);
convertView.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.list_selected));
}
return convertView;
}
@SuppressLint("DefaultLocale")
@Override
public Filter getFilter() {
return new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,FilterResults results) {
arrayList = (List<KeyPairBoolData>) results.values; // has the filtered values
notifyDataSetChanged(); // notifies the data with new filtered values
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults(); // Holds the results of a filtering operation in values
List<KeyPairBoolData> FilteredArrList = new ArrayList<>();
if (mOriginalValues == null) {
mOriginalValues = new ArrayList<>(arrayList); // saves the original data in mOriginalValues
}
/********
*
* If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values
* else does the Filtering and returns FilteredArrList(Filtered)
*
********/
if (constraint == null || constraint.length() == 0) {
// set the Original result to return
results.count = mOriginalValues.size();
results.values = mOriginalValues;
} else {
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < mOriginalValues.size(); i++) {
Log.i(TAG, "Filter : " + mOriginalValues.get(i).getName() + " -> " + mOriginalValues.get(i).isSelected());
String data = mOriginalValues.get(i).getName();
if (data.toLowerCase().contains(constraint.toString())) {
FilteredArrList.add(mOriginalValues.get(i));
}
}
// set the Filtered result to return
results.count = FilteredArrList.size();
results.values = FilteredArrList;
}
return results;
}
};
}
}
}
@@ -0,0 +1,7 @@
package com.androidbuts.multispinnerfilter;
import java.util.List;
public interface SpinnerListener {
void onItemsSelected(List<KeyPairBoolData> items);
}
@@ -0,0 +1,19 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.androidbuts.multispinnerfilter.MultiSpinner
android:id="@+id/simpleMultiSpinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp" />
<com.androidbuts.multispinnerfilter.MultiSpinnerSearch
android:id="@+id/searchMultiSpinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:layout_marginTop="20dp" />
</LinearLayout>
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:gravity="center_horizontal"
android:orientation="vertical">
<EditText
android:id="@+id/alertSearchEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/type_to_search"
android:inputType="text">
<requestFocus />
</EditText>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:background="@android:color/transparent">
<ListView
android:id="@+id/alertSearchListView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:cacheColorHint="@null"
android:fadeScrollbars="true"
android:fastScrollEnabled="true"
android:textFilterEnabled="true" />
<TextView
android:id="@+id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center"
android:text="Not found !"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@color/red" />
</RelativeLayout>
</LinearLayout>
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@android:color/transparent">
<TextView
android:id="@+id/alertTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/alertCheckbox"
android:text="Item Name"
android:textAppearance="?android:attr/textAppearanceMedium" />
<CheckBox
android:id="@+id/alertCheckbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:clickable="false"
android:buttonTint="@color/ripple"/>
</RelativeLayout>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
android:padding="10dp">
<TextView
android:id="@+id/alertTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
tools:text="Item Name"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/listTextViewSpinner"
android:paddingLeft="5dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:background="@null"
android:singleLine="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:textColor="#FF000000" />
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MultiSpinnerSearch">
<attr name="hintText" format="string"/>
</declare-styleable>
</resources>
@@ -0,0 +1,25 @@
<resources>
<style name="MaterialSpinner" parent="Material.Widget.Spinner">
<item name="rd_style">@style/Material.Drawable.Ripple.Wave.Light</item>
<item name="spn_labelEnable">true</item>
<item name="spn_labelTextSize">18sp</item>
<item name="spn_arrowSwitchMode">true</item>
<item name="spn_arrowAnimDuration">@android:integer/config_shortAnimTime</item>
<item name="spn_arrowInterpolator">@android:anim/decelerate_interpolator</item>
</style>
<style name="myDialog" parent="@android:style/Theme.Holo.Light.Dialog">
<item name="android:windowTitleStyle">@style/myDialogTitle</item>
</style>
<style name="myDialogTitle" parent="@android:style/TextAppearance.DialogWindowTitle">
<item name="android:gravity">center_horizontal</item>
</style>
<style name="DialogWindowTitle">
<item name="android:maxLines">1</item>
<item name="android:scrollHorizontally">true</item>
<item name="android:textAppearance">@android:style/TextAppearance.DialogWindowTitle</item>
</style>
</resources>
+35
View File
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ColorPrimary">#29CA97</color>
<color name="ColorPrimaryDark">#06ACE4</color>
<color name="list_background">#06ACE4</color>
<color name="blue">#1589FF</color>
<color name="white">#FFFFFF</color>
<color name="black">#000000</color>
<color name="gray">#D1D0CE</color>
<color name="background_color">#E1E2E2</color>
<color name="primary">#3f51b5</color>
<color name="primary_pressed">#E1E2E2</color>
<color name="primary_dark">#303f9f</color>
<color name="ripple">#F06292</color>
<color name="red">#FF0000</color>
<color name="cyan">#00FFFF</color>
<color name="lightBlue">#ADD8E6</color>
<color name="text_color">#686868</color>
<color name="android_text_color">#747474</color>
<color name="app_topbar_color">#AAAAAA</color>
<color name="list_even">#AAAAAA</color>
<color name="list_odd">#E1E2E2</color>
<color name="list_selected">#455FB6</color>
<color name="list_header">#99979C</color>
<!-- FF5722, E64A19-->
</resources>
+7
View File
@@ -0,0 +1,7 @@
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
</resources>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="type_to_search">Type to Search</string>
</resources>
+26
View File
@@ -0,0 +1,26 @@
<resources>
<style name="MaterialSpinner" parent="Widget.AppCompat.Spinner">
<item name="rd_style">@style/Material.Drawable.Ripple.Wave.Light</item>
<item name="spn_labelEnable">true</item>
<item name="spn_labelTextSize">18sp</item>
<item name="spn_arrowSwitchMode">true</item>
<item name="spn_arrowAnimDuration">@android:integer/config_shortAnimTime</item>
<item name="spn_arrowInterpolator">@android:anim/decelerate_interpolator</item>
</style>
<style name="myDialog" parent="@android:style/Theme.Holo.Light.Dialog">
<item name="android:windowTitleStyle">@style/myDialogTitle</item>
</style>
<style name="myDialogTitle" parent="@android:style/TextAppearance.DialogWindowTitle">
<item name="android:gravity">center_horizontal</item>
</style>
<style name="DialogWindowTitle">
<item name="android:maxLines">1</item>
<item name="android:scrollHorizontally">true</item>
<item name="android:textAppearance">@android:style/TextAppearance.DialogWindowTitle</item>
</style>
</resources>