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