diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser
new file mode 100644
index 0000000..3294dfb
Binary files /dev/null and b/.idea/caches/build_file_checksums.ser differ
diff --git a/.idea/caches/gradle_models.ser b/.idea/caches/gradle_models.ser
new file mode 100644
index 0000000..c7d6dfe
Binary files /dev/null and b/.idea/caches/gradle_models.ser differ
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
deleted file mode 100644
index 96cc43e..0000000
--- a/.idea/compiler.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml
deleted file mode 100644
index e7bedf3..0000000
--- a/.idea/copyright/profiles_settings.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..15a15b2
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 5d19981..703e5d4 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,43 +1,11 @@
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 94a25f7..35eb1dd 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/README.md b/README.md
index cd95d19..47a31de 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@ Step 1. Add the JitPack repository to your build file
Step 2. Add the dependency
dependencies {
- compile 'com.github.MdFarhanRaja:SearchableSpinner:1.2'
+ compile 'com.github.MdFarhanRaja:SearchableSpinner:2.0'
}
Step 3. Inside JAVA
@@ -43,8 +43,11 @@ Step 3. Inside JAVA
items.add("Kanpur");
- spinnerDialog=new SpinnerDialog(MainActivity.this,items,"Select or Search City");// With No Animation
- spinnerDialog=new SpinnerDialog(MainActivity.this,items,"Select or Search City",R.style.DialogAnimations_SmileWindow);// With Animation
+ spinnerDialog=new SpinnerDialog(MainActivity.this,items,"Select or Search City","Close Button Text");// With No Animation
+ spinnerDialog=new SpinnerDialog(MainActivity.this,items,"Select or Search City",R.style.DialogAnimations_SmileWindow,"Close Button Text");// With Animation
+
+ spinnerDialog.setCancellable(true); // for cancellable
+ spinnerDialog.setShowKeyboard(false);// for open keyboard by default
spinnerDialog.bindOnSpinerListener(new OnSpinerItemClick() {
@@ -67,8 +70,8 @@ Step 4. Add custom style in your styles.xml
diff --git a/app/build.gradle b/app/build.gradle
index 2ec9724..6a569b1 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,12 +1,12 @@
apply plugin: 'com.android.application'
android {
- compileSdkVersion 25
- buildToolsVersion "25.0.2"
+ compileSdkVersion 27
+ buildToolsVersion '27.0.3'
defaultConfig {
applicationId "in.galaxyofandroid.searchablespinner"
minSdkVersion 14
- targetSdkVersion 25
+ targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
@@ -20,11 +20,12 @@ android {
}
dependencies {
- compile fileTree(include: ['*.jar'], dir: 'libs')
- androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
+ implementation fileTree(include: ['*.jar'], dir: 'libs')
+ androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
- compile 'com.android.support:appcompat-v7:25.2.0'
- testCompile 'junit:junit:4.12'
- compile project(':spinerdialog')
+ implementation 'com.android.support:appcompat-v7:27.1.1'
+ testImplementation 'junit:junit:4.12'
+ //implementation 'com.github.MdFarhanRaja:SearchableSpinner:2.1'
+ implementation project(':spinerdialog')
}
diff --git a/app/src/main/java/in/galaxyofandroid/searchablespinner/MainActivity.java b/app/src/main/java/in/galaxyofandroid/searchablespinner/MainActivity.java
index c520e8e..38930eb 100644
--- a/app/src/main/java/in/galaxyofandroid/searchablespinner/MainActivity.java
+++ b/app/src/main/java/in/galaxyofandroid/searchablespinner/MainActivity.java
@@ -11,17 +11,16 @@
import in.galaxyofandroid.spinerdialog.OnSpinerItemClick;
import in.galaxyofandroid.spinerdialog.SpinnerDialog;
-public class MainActivity extends AppCompatActivity
-{
- ArrayList items=new ArrayList<>();
+public class MainActivity extends AppCompatActivity {
+ ArrayList items = new ArrayList<>();
SpinnerDialog spinnerDialog;
+
@Override
- protected void onCreate(Bundle savedInstanceState)
- {
+ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
- final TextView selectedItems=(TextView)findViewById(R.id.txt);
+ final TextView selectedItems = (TextView) findViewById(R.id.txt);
items.add("Mumbai");
@@ -37,29 +36,33 @@ protected void onCreate(Bundle savedInstanceState)
items.add("Lucknow");
items.add("Kanpur");
- spinnerDialog=new SpinnerDialog(MainActivity.this,items,"Select or Search City",R.style.DialogAnimations_SmileWindow);
+ spinnerDialog = new SpinnerDialog(MainActivity.this, items,
+ "Select or Search City");
+
+ spinnerDialog.setTitleColor(getResources().getColor(R.color.colorAccent));
+ spinnerDialog.setSearchIconColor(getResources().getColor(R.color.colorAccent));
+ spinnerDialog.setSearchTextColor(getResources().getColor(R.color.colorAccent));
+ spinnerDialog.setItemColor(getResources().getColor(R.color.colorAccent));
+ spinnerDialog.setItemDividerColor(getResources().getColor(R.color.colorAccent));
+ spinnerDialog.setCloseColor(getResources().getColor(R.color.colorAccent));
+
+ spinnerDialog.setCancellable(true);
+ spinnerDialog.setShowKeyboard(false);
- spinnerDialog.bindOnSpinerListener(new OnSpinerItemClick()
- {
+ spinnerDialog.bindOnSpinerListener(new OnSpinerItemClick() {
@Override
- public void onClick(String item, int position)
- {
- Toast.makeText(MainActivity.this, item + " " + position+"", Toast.LENGTH_SHORT).show();
+ public void onClick(String item, int position) {
+ Toast.makeText(MainActivity.this, item + " " + position + "", Toast.LENGTH_SHORT).show();
selectedItems.setText(item + " Position: " + position);
}
});
- findViewById(R.id.show).setOnClickListener(new View.OnClickListener()
- {
+ findViewById(R.id.show).setOnClickListener(new View.OnClickListener() {
@Override
- public void onClick(View v)
- {
+ public void onClick(View v) {
spinnerDialog.showSpinerDialog();
}
});
}
-
-
-
}
diff --git a/app/src/main/res/anim/slide_in_bottom.xml b/app/src/main/res/anim/slide_in_bottom.xml
index c670b90..ccea877 100644
--- a/app/src/main/res/anim/slide_in_bottom.xml
+++ b/app/src/main/res/anim/slide_in_bottom.xml
@@ -1,4 +1,4 @@
\ No newline at end of file
diff --git a/app/src/main/res/anim/slide_out_top.xml b/app/src/main/res/anim/slide_out_top.xml
index 455a2f5..7fba593 100644
--- a/app/src/main/res/anim/slide_out_top.xml
+++ b/app/src/main/res/anim/slide_out_top.xml
@@ -1,4 +1,4 @@
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index cf8e129..6f08327 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -10,8 +10,8 @@
diff --git a/build.gradle b/build.gradle
index 09574e3..043db0a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,13 +1,14 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
-task wrapper(type: Wrapper){
- gradleVersion='2.2'
+task wrapper(type: Wrapper) {
+ gradleVersion = '2.2'
}
buildscript {
repositories {
jcenter()
+ google()
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.3.1'
+ classpath 'com.android.tools.build:gradle:3.1.4'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
// NOTE: Do not place your application dependencies here; they belong
@@ -18,6 +19,8 @@ buildscript {
allprojects {
repositories {
jcenter()
+ google()
+ maven { url 'https://jitpack.io' }
}
}
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 915aade..1147905 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Thu May 04 18:58:59 IST 2017
+#Sat Apr 07 15:45:55 IST 2018
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
diff --git a/spinerdialog/build.gradle b/spinerdialog/build.gradle
index 3640cc2..ecae4c3 100644
--- a/spinerdialog/build.gradle
+++ b/spinerdialog/build.gradle
@@ -1,12 +1,13 @@
apply plugin: 'com.android.library'
+apply plugin: 'android-maven'
android {
- compileSdkVersion 25
- buildToolsVersion "25.0.2"
+ compileSdkVersion 27
+ buildToolsVersion '27.0.3'
defaultConfig {
minSdkVersion 14
- targetSdkVersion 25
+ targetSdkVersion 27
versionCode 1
versionName "1.0"
@@ -22,13 +23,13 @@ android {
}
dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
- androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
- compile 'com.android.support:appcompat-v7:25.2.0'
+ implementation 'com.android.support:appcompat-v7:27.1.1'
apply plugin: 'com.github.dcendents.android-maven'
group = 'com.github.MdFarhanRaja'
- testCompile 'junit:junit:4.12'
+ testImplementation 'junit:junit:4.12'
}
diff --git a/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/ArrayAdapterWithContainsFilter.java b/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/ArrayAdapterWithContainsFilter.java
new file mode 100644
index 0000000..2e5e018
--- /dev/null
+++ b/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/ArrayAdapterWithContainsFilter.java
@@ -0,0 +1,50 @@
+package in.galaxyofandroid.spinerdialog;
+
+import android.app.Activity;
+import android.content.Context;
+import android.support.annotation.NonNull;
+import android.widget.ArrayAdapter;
+import android.widget.Filter;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+public class ArrayAdapterWithContainsFilter extends ArrayAdapter {
+
+ private List items = null;
+ private ArrayList arraylist;
+
+ public ArrayAdapterWithContainsFilter(Activity context, int items_view, ArrayList items) {
+ super(context,items_view,items);
+ this.items = items;
+ this.arraylist = new ArrayList();
+ this.arraylist.addAll(items);
+ }
+
+ @NonNull
+ @Override
+ public Filter getFilter() {
+ return super.getFilter();
+ }
+
+ // Filter Class
+ public void getContainsFilter(String charText) {
+ charText = charText.toLowerCase(Locale.getDefault());
+ items.clear();
+ if (charText.length() == 0) {
+ items.addAll(arraylist);
+ }
+ else
+ {
+ for (String item : arraylist)
+ {
+ if (item.toLowerCase(Locale.getDefault()).contains(charText))
+ {
+ items.add(item);
+ }
+ }
+ }
+ notifyDataSetChanged();
+ }
+}
diff --git a/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/SpinnerDialog.java b/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/SpinnerDialog.java
index ec86212..edf0084 100644
--- a/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/SpinnerDialog.java
+++ b/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/SpinnerDialog.java
@@ -3,12 +3,17 @@
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
+import android.graphics.drawable.ColorDrawable;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
import android.widget.EditText;
+import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
@@ -21,25 +26,55 @@
public class SpinnerDialog {
ArrayList items;
Activity context;
- String dTitle;
+ String dTitle, closeTitle = "Close";
OnSpinerItemClick onSpinerItemClick;
AlertDialog alertDialog;
int pos;
int style;
+ boolean cancellable = false;
+ boolean showKeyboard = false;
+ boolean useContainsFilter = false;
+ int titleColor,searchIconColor,searchTextColor,itemColor,itemDividerColor,closeColor;
+
+ private void initColor(Context context){
+ this.titleColor=context.getResources().getColor(R.color.colorBlack);
+ this.searchIconColor=context.getResources().getColor(R.color.colorBlack);
+ this.searchTextColor=context.getResources().getColor(R.color.colorBlack);
+ this.itemColor=context.getResources().getColor(R.color.colorBlack);
+ this.closeColor=context.getResources().getColor(R.color.colorBlack);
+ this.itemDividerColor=context.getResources().getColor(R.color.colorLightGray);
+ }
+ public SpinnerDialog(Activity activity, ArrayList items, String dialogTitle) {
+ this.items = items;
+ this.context = activity;
+ this.dTitle = dialogTitle;
+ initColor(context);
+ }
+ public SpinnerDialog(Activity activity, ArrayList items, String dialogTitle, String closeTitle) {
+ this.items = items;
+ this.context = activity;
+ this.dTitle = dialogTitle;
+ this.closeTitle = closeTitle;
+ initColor(context);
+ }
- public SpinnerDialog(Activity activity,ArrayList items,String dialogTitle) {
+ public SpinnerDialog(Activity activity, ArrayList items, String dialogTitle, int style) {
this.items = items;
this.context = activity;
- this.dTitle=dialogTitle;
+ this.dTitle = dialogTitle;
+ this.style = style;
+ initColor(context);
}
- public SpinnerDialog(Activity activity,ArrayList items,String dialogTitle,int style) {
+ public SpinnerDialog(Activity activity, ArrayList items, String dialogTitle, int style, String closeTitle) {
this.items = items;
this.context = activity;
- this.dTitle=dialogTitle;
- this.style=style;
+ this.dTitle = dialogTitle;
+ this.style = style;
+ this.closeTitle = closeTitle;
+ initColor(context);
}
public void bindOnSpinerListener(OnSpinerItemClick onSpinerItemClick1) {
@@ -51,30 +86,53 @@ public void showSpinerDialog() {
View v = context.getLayoutInflater().inflate(R.layout.dialog_layout, null);
TextView rippleViewClose = (TextView) v.findViewById(R.id.close);
TextView title = (TextView) v.findViewById(R.id.spinerTitle);
+ ImageView searchIcon=(ImageView) v.findViewById(R.id.searchIcon);
+ rippleViewClose.setText(closeTitle);
title.setText(dTitle);
final ListView listView = (ListView) v.findViewById(R.id.list);
+
+ ColorDrawable sage = new ColorDrawable(itemDividerColor);
+ listView.setDivider(sage);
+ listView.setDividerHeight(1);
+
final EditText searchBox = (EditText) v.findViewById(R.id.searchBox);
- final ArrayAdapter adapter = new ArrayAdapter(context, R.layout.items_view, items);
+ if (isShowKeyboard()) {
+ showKeyboard(searchBox);
+ }
+
+ title.setTextColor(titleColor);
+ searchBox.setTextColor(searchTextColor);
+ rippleViewClose.setTextColor(closeColor);
+ searchIcon.setColorFilter(searchIconColor);
+
+
+// final ArrayAdapter adapter = new ArrayAdapter(context, R.layout.items_view, items);
+ final ArrayAdapterWithContainsFilter adapter = new ArrayAdapterWithContainsFilter(context, R.layout.items_view, items) {
+ @NonNull
+ @Override
+ public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
+ View view = super.getView(position, convertView, parent);
+ TextView text1=view.findViewById(R.id.text1);
+ text1.setTextColor(itemColor);
+ return view;
+ }
+ };
listView.setAdapter(adapter);
adb.setView(v);
alertDialog = adb.create();
alertDialog.getWindow().getAttributes().windowAnimations = style;//R.style.DialogAnimations_SmileWindow;
- alertDialog.setCancelable(false);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
- public void onItemClick(AdapterView> adapterView, View view, int i, long l)
- {
- TextView t=(TextView)view.findViewById(R.id.text1);
- for(int j=0;j adapterView, View view, int i, long l) {
+ TextView t = (TextView) view.findViewById(R.id.text1);
+ for (int j = 0; j < items.size(); j++) {
+ if (t.getText().toString().equalsIgnoreCase(items.get(j).toString())) {
+ pos = j;
}
}
- onSpinerItemClick.onClick(t.getText().toString(),pos);
- alertDialog.dismiss();
+ onSpinerItemClick.onClick(t.getText().toString(), pos);
+ closeSpinerDialog();
}
});
@@ -91,17 +149,98 @@ public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
@Override
public void afterTextChanged(Editable editable) {
- adapter.getFilter().filter(searchBox.getText().toString());
+ if (isUseContainsFilter()) {
+ adapter.getContainsFilter(searchBox.getText().toString());
+ } else {
+ adapter.getFilter().filter(searchBox.getText().toString());
+ }
}
});
rippleViewClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- alertDialog.dismiss();
+ closeSpinerDialog();
}
});
+ alertDialog.setCancelable(isCancellable());
+ alertDialog.setCanceledOnTouchOutside(isCancellable());
alertDialog.show();
}
+ public void closeSpinerDialog() {
+ hideKeyboard();
+ if (alertDialog != null) {
+ alertDialog.dismiss();
+ }
+ }
+
+ private void hideKeyboard() {
+ try {
+ InputMethodManager inputManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputManager.hideSoftInputFromWindow(context.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
+ } catch (Exception e) {
+ }
+ }
+
+ private void showKeyboard(final EditText ettext) {
+ ettext.requestFocus();
+ ettext.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
+ keyboard.showSoftInput(ettext, 0);
+ }
+ }
+ , 200);
+ }
+
+ private boolean isCancellable() {
+ return cancellable;
+ }
+
+ public void setCancellable(boolean cancellable) {
+ this.cancellable = cancellable;
+ }
+
+ private boolean isShowKeyboard() {
+ return showKeyboard;
+ }
+
+ private boolean isUseContainsFilter() {
+ return useContainsFilter;
+ }
+
+
+ public void setShowKeyboard(boolean showKeyboard) {
+ this.showKeyboard = showKeyboard;
+ }
+
+ public void setUseContainsFilter(boolean useContainsFilter) {
+ this.useContainsFilter = useContainsFilter;
+ }
+
+ public void setTitleColor(int titleColor) {
+ this.titleColor = titleColor;
+ }
+
+ public void setSearchIconColor(int searchIconColor) {
+ this.searchIconColor = searchIconColor;
+ }
+
+ public void setSearchTextColor(int searchTextColor) {
+ this.searchTextColor = searchTextColor;
+ }
+
+ public void setItemColor(int itemColor) {
+ this.itemColor = itemColor;
+ }
+
+ public void setCloseColor(int closeColor) {
+ this.closeColor = closeColor;
+ }
+
+ public void setItemDividerColor(int itemDividerColor) {
+ this.itemDividerColor = itemDividerColor;
+ }
}
diff --git a/spinerdialog/src/main/res/layout/dialog_layout.xml b/spinerdialog/src/main/res/layout/dialog_layout.xml
index a0440c1..0d66209 100644
--- a/spinerdialog/src/main/res/layout/dialog_layout.xml
+++ b/spinerdialog/src/main/res/layout/dialog_layout.xml
@@ -4,6 +4,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
+ android:id="@+id/mainView"
android:orientation="vertical">
@@ -42,6 +44,7 @@
@@ -51,7 +54,7 @@
android:layout_width="match_parent"
android:layout_height="300dp"
android:divider="#d1d1d1"
- android:dividerHeight="0.1dp">
+ android:dividerHeight="0.1dp"/>
+
+ #FFFFFF
+ #18D1CD
+ #949494
+ #C9C9C9
+ #E9E7E7
+ #000000
+ #FFFFFF
+
diff --git a/spinerdialog/src/main/res/values/styles.xml b/spinerdialog/src/main/res/values/styles.xml
index 3a23daf..da5ecc8 100644
--- a/spinerdialog/src/main/res/values/styles.xml
+++ b/spinerdialog/src/main/res/values/styles.xml
@@ -3,8 +3,8 @@
\ No newline at end of file