Add new changes GeoFencing-GeoTaging and hide Manual Inword Option etc
This commit is contained in:
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<string name="type_to_search">Type to Search</string>
|
||||
|
||||
</resources>
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user