diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 3294dfb..f0cdb84 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/caches/gradle_models.ser b/.idea/caches/gradle_models.ser index c7d6dfe..ac3b984 100644 Binary files a/.idea/caches/gradle_models.ser and b/.idea/caches/gradle_models.ser differ diff --git a/.idea/misc.xml b/.idea/misc.xml index 703e5d4..af0bbdd 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -5,7 +5,7 @@ - + diff --git a/README.md b/README.md index 47a31de..a034d33 100644 --- a/README.md +++ b/README.md @@ -75,3 +75,88 @@ Step 4. Add custom style in your styles.xml +# Use with pagination + +Step 1. Inside JAVA + + public class MainActivityPaged extends AppCompatActivity { + + ArrayList mItems = new ArrayList<>(); + SpinnerDialogPaged mSpinnerDialogPaged; + TextView mSelectedItems; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + mSelectedItems = findViewById(R.id.txt); + + mSpinnerDialogPaged = new SpinnerDialogPaged(MainActivityPaged.this, mItems, + "Select"); + + mSpinnerDialogPaged.setCancellable(true); // for cancellable + mSpinnerDialogPaged.setShowKeyboard(false); // for open keyboard by default + mSpinnerDialogPaged.setVisibleThreshold(3); // set visible threshold + mSpinnerDialogPaged.setHideSearchField(true); // hide or show search field with true of false + + getUsers(1); // make your request for api + + findViewById(R.id.show).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mSpinnerDialogPaged.showSpinerDialog(); + } + }); + + + mSpinnerDialogPaged.bindOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(int page) { + getUsers(page); // make your request for api with the new page returned + } + }); + + mSpinnerDialogPaged.bindOnAfterTextChanged(new OnAfterTextChangedListener() { + @Override + public void onAfterTextChanged(String term) { + // get the search term + } + }); + + } + + private void getUsers(int page) { + mSpinnerDialogPaged.showProgressBar(); // show the progress bar before your request + + RetrofitConfig.createService(UserService.class).getUsers(page).enqueue(new Callback() { + @Override + public void onResponse(Call call, retrofit2.Response response) { + if (response.isSuccessful()) { + mSpinnerDialogPaged.hideProgressBar(); // hide the progress bar after your request + + for (Data item : response.body().getData()) { + mItems.add(item.getEmail()); + } + + mSpinnerDialogPaged.addMoreItems(mItems); + mSpinnerDialogPaged.bindOnSpinerListener(new OnSpinerItemClick() { + @Override + public void onClick(String item, int position) { + Toast.makeText(MainActivityPaged.this, item + " " + position + "", Toast.LENGTH_SHORT).show(); + mSelectedItems.setText(item + " Position: " + position); + + } + }); + + } + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } + + + } diff --git a/app/build.gradle b/app/build.gradle index 6a569b1..2c1d1ba 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,4 +28,9 @@ dependencies { testImplementation 'junit:junit:4.12' //implementation 'com.github.MdFarhanRaja:SearchableSpinner:2.1' implementation project(':spinerdialog') + implementation 'com.squareup.retrofit2:retrofit:2.5.0' + implementation 'com.squareup.retrofit2:converter-gson:2.5.0' + implementation 'com.squareup.okhttp3:logging-interceptor:3.12.1' + + } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5116cb9..f5c8d3d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,13 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/in/galaxyofandroid/searchablespinner/Data.java b/app/src/main/java/in/galaxyofandroid/searchablespinner/Data.java new file mode 100644 index 0000000..56f7a53 --- /dev/null +++ b/app/src/main/java/in/galaxyofandroid/searchablespinner/Data.java @@ -0,0 +1,23 @@ +package in.galaxyofandroid.searchablespinner; + +public class Data { + + private Integer id; + private String email; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/app/src/main/java/in/galaxyofandroid/searchablespinner/MainActivityPaged.java b/app/src/main/java/in/galaxyofandroid/searchablespinner/MainActivityPaged.java new file mode 100644 index 0000000..46911be --- /dev/null +++ b/app/src/main/java/in/galaxyofandroid/searchablespinner/MainActivityPaged.java @@ -0,0 +1,105 @@ +package in.galaxyofandroid.searchablespinner; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.View; +import android.widget.TextView; +import android.widget.Toast; + +import java.util.ArrayList; + +import in.galaxyofandroid.spinerdialog.OnAfterTextChangedListener; +import in.galaxyofandroid.spinerdialog.OnLoadMoreListener; +import in.galaxyofandroid.spinerdialog.OnSpinerItemClick; +import in.galaxyofandroid.spinerdialog.SpinnerDialogPaged; +import retrofit2.Call; +import retrofit2.Callback; + +public class MainActivityPaged extends AppCompatActivity { + + ArrayList mItems = new ArrayList<>(); + SpinnerDialogPaged mSpinnerDialogPaged; + TextView mSelectedItems; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + mSelectedItems = findViewById(R.id.txt); + + mSpinnerDialogPaged = new SpinnerDialogPaged(MainActivityPaged.this, mItems, + "Select"); + + mSpinnerDialogPaged.setTitleColor(getResources().getColor(R.color.colorAccent)); + mSpinnerDialogPaged.setSearchIconColor(getResources().getColor(R.color.colorAccent)); + mSpinnerDialogPaged.setSearchTextColor(getResources().getColor(R.color.colorAccent)); + mSpinnerDialogPaged.setItemColor(getResources().getColor(R.color.colorAccent)); + mSpinnerDialogPaged.setItemDividerColor(getResources().getColor(R.color.colorAccent)); + mSpinnerDialogPaged.setCloseColor(getResources().getColor(R.color.colorAccent)); + + mSpinnerDialogPaged.setCancellable(true); // for cancellable + mSpinnerDialogPaged.setShowKeyboard(false); // for open keyboard by default + mSpinnerDialogPaged.setVisibleThreshold(3); // set visible threshold + mSpinnerDialogPaged.setHideSearchField(true); // hide or show search field with true of false + + getUsers(1); // make your request for api + + findViewById(R.id.show).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mSpinnerDialogPaged.showSpinerDialog(); + } + }); + + + mSpinnerDialogPaged.bindOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(int page) { + getUsers(page); // make your request for api with the new page returned + } + }); + + mSpinnerDialogPaged.bindOnAfterTextChanged(new OnAfterTextChangedListener() { + @Override + public void onAfterTextChanged(String term) { + // get the search term + } + }); + + } + + private void getUsers(int page) { + mSpinnerDialogPaged.showProgressBar(); // show the progress bar before your request + + RetrofitConfig.createService(UserService.class).getUsers(page).enqueue(new Callback() { + @Override + public void onResponse(Call call, retrofit2.Response response) { + if (response.isSuccessful()) { + mSpinnerDialogPaged.hideProgressBar(); // hide the progress bar after your request + + for (Data item : response.body().getData()) { + mItems.add(item.getEmail()); + } + + mSpinnerDialogPaged.addMoreItems(mItems); + mSpinnerDialogPaged.bindOnSpinerListener(new OnSpinerItemClick() { + @Override + public void onClick(String item, int position) { + Toast.makeText(MainActivityPaged.this, item + " " + position + "", Toast.LENGTH_SHORT).show(); + mSelectedItems.setText(item + " Position: " + position); + + } + }); + + } + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } + + +} diff --git a/app/src/main/java/in/galaxyofandroid/searchablespinner/Response.java b/app/src/main/java/in/galaxyofandroid/searchablespinner/Response.java new file mode 100644 index 0000000..bee3e53 --- /dev/null +++ b/app/src/main/java/in/galaxyofandroid/searchablespinner/Response.java @@ -0,0 +1,35 @@ +package in.galaxyofandroid.searchablespinner; + +import java.util.List; + +public class Response { + + private int page; + private int total; + + private List data; + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } +} diff --git a/app/src/main/java/in/galaxyofandroid/searchablespinner/RetrofitConfig.java b/app/src/main/java/in/galaxyofandroid/searchablespinner/RetrofitConfig.java new file mode 100644 index 0000000..7fa4442 --- /dev/null +++ b/app/src/main/java/in/galaxyofandroid/searchablespinner/RetrofitConfig.java @@ -0,0 +1,35 @@ +package in.galaxyofandroid.searchablespinner; + +import com.google.gson.Gson; + +import java.util.concurrent.TimeUnit; + +import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class RetrofitConfig { + + private static final String BASE_URL = "https://reqres.in/"; + + public static S createService(Class serviceClass) { + + HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); + loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + + OkHttpClient.Builder httpClient = new OkHttpClient.Builder() + .readTimeout(15, TimeUnit.SECONDS); + + httpClient.addInterceptor(loggingInterceptor); + + Retrofit retrofit = new Retrofit.Builder() + .baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create(new Gson())) + .client(httpClient.build()) + .build(); + + return retrofit.create(serviceClass); + } + +} diff --git a/app/src/main/java/in/galaxyofandroid/searchablespinner/UserService.java b/app/src/main/java/in/galaxyofandroid/searchablespinner/UserService.java new file mode 100644 index 0000000..c9a09c0 --- /dev/null +++ b/app/src/main/java/in/galaxyofandroid/searchablespinner/UserService.java @@ -0,0 +1,11 @@ +package in.galaxyofandroid.searchablespinner; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface UserService { + + @GET("api/users") + Call getUsers(@Query("page") int page); +} diff --git a/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/EndlessScrollListener.java b/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/EndlessScrollListener.java new file mode 100644 index 0000000..c1c19d6 --- /dev/null +++ b/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/EndlessScrollListener.java @@ -0,0 +1,39 @@ +package in.galaxyofandroid.spinerdialog; + +import android.widget.AbsListView; + +public abstract class EndlessScrollListener implements AbsListView.OnScrollListener { + + private int visibleThreshold; + private int currentPage = 0; + private int previousTotal = 0; + private boolean loading = true; + + public EndlessScrollListener(int visibleThreshold) { + this.visibleThreshold = visibleThreshold; + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, + int visibleItemCount, int totalItemCount) { + if (loading) { + if (totalItemCount > previousTotal) { + loading = false; + previousTotal = totalItemCount; + currentPage++; + } + } + if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) { + // I load the next page of gigs using a background task, + // but you can call any function here. + onLoadMore(currentPage + 1); + loading = true; + } + } + + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + } + + abstract void onLoadMore(int currentPage); +} diff --git a/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/OnAfterTextChangedListener.java b/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/OnAfterTextChangedListener.java new file mode 100644 index 0000000..3b19248 --- /dev/null +++ b/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/OnAfterTextChangedListener.java @@ -0,0 +1,6 @@ +package in.galaxyofandroid.spinerdialog; + +public interface OnAfterTextChangedListener { + + void onAfterTextChanged(String term); +} diff --git a/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/OnLoadMoreListener.java b/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/OnLoadMoreListener.java new file mode 100644 index 0000000..098af87 --- /dev/null +++ b/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/OnLoadMoreListener.java @@ -0,0 +1,10 @@ +package in.galaxyofandroid.spinerdialog; + +/** + * Created by Md Farhan Raja on 2/23/2017. + */ + +public interface OnLoadMoreListener +{ + void onLoadMore(int page); +} diff --git a/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/SpinnerDialog.java b/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/SpinnerDialog.java index edf0084..32673b7 100644 --- a/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/SpinnerDialog.java +++ b/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/SpinnerDialog.java @@ -15,15 +15,19 @@ import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; +import android.widget.ProgressBar; import android.widget.TextView; import java.util.ArrayList; +import java.util.HashSet; /** * Created by Md Farhan Raja on 2/23/2017. */ public class SpinnerDialog { + + private ArrayAdapterWithContainsFilter adapter; ArrayList items; Activity context; String dTitle, closeTitle = "Close"; @@ -34,15 +38,16 @@ public class SpinnerDialog { 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); + int titleColor, searchIconColor, searchTextColor, itemColor, itemDividerColor, closeColor; + private ProgressBar mProgressBar; + + 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) { @@ -86,7 +91,10 @@ 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); + ImageView searchIcon = (ImageView) v.findViewById(R.id.searchIcon); + mProgressBar = v.findViewById(R.id.progress_bar); + mProgressBar.setVisibility(View.GONE); + rippleViewClose.setText(closeTitle); title.setText(dTitle); final ListView listView = (ListView) v.findViewById(R.id.list); @@ -107,12 +115,12 @@ public void showSpinerDialog() { // final ArrayAdapter adapter = new ArrayAdapter(context, R.layout.items_view, items); - final ArrayAdapterWithContainsFilter adapter = new ArrayAdapterWithContainsFilter(context, R.layout.items_view, items) { + 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); + TextView text1 = view.findViewById(R.id.text1); text1.setTextColor(itemColor); return view; } @@ -195,6 +203,26 @@ public void run() { , 200); } + public void hideProgressBar() { + if (mProgressBar != null) { + mProgressBar.setVisibility(View.GONE); + } + } + + public void showProgressBar() { + if (mProgressBar != null) { + mProgressBar.setVisibility(View.VISIBLE); + } + } + + public void addMoreItems(ArrayList items) { + this.items.addAll(items); + + if (adapter != null) { + adapter.notifyDataSetChanged(); + } + } + private boolean isCancellable() { return cancellable; } diff --git a/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/SpinnerDialogPaged.java b/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/SpinnerDialogPaged.java new file mode 100644 index 0000000..b88069b --- /dev/null +++ b/spinerdialog/src/main/java/in/galaxyofandroid/spinerdialog/SpinnerDialogPaged.java @@ -0,0 +1,301 @@ +package in.galaxyofandroid.spinerdialog; + +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.EditText; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.ProgressBar; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.HashSet; + +/** + * Created by Ângelo Robson on 22/07/2019. + */ + +public class SpinnerDialogPaged { + + ArrayList items; + Activity context; + String dTitle, closeTitle = "Close"; + OnSpinerItemClick onSpinerItemClick; + private OnLoadMoreListener mOnLoadMoreListener; + AlertDialog alertDialog; + int pos; + int style; + boolean cancellable = false; + boolean showKeyboard = false; + boolean useContainsFilter = false; + int titleColor, searchIconColor, searchTextColor, itemColor, itemDividerColor, closeColor; + private ArrayAdapterWithContainsFilter adapter; + private int visibleThreshold = 5; + private boolean isHideSearchField; + private OnAfterTextChangedListener onAfterTextChangedListener; + private ProgressBar mProgressBar; + + 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 SpinnerDialogPaged(Activity activity, ArrayList items, String dialogTitle) { + this.items = items; + this.context = activity; + this.dTitle = dialogTitle; + initColor(context); + } + + public SpinnerDialogPaged(Activity activity, ArrayList items, String dialogTitle, String closeTitle) { + this.items = items; + this.context = activity; + this.dTitle = dialogTitle; + this.closeTitle = closeTitle; + initColor(context); + } + + public SpinnerDialogPaged(Activity activity, ArrayList items, String dialogTitle, int style) { + this.items = items; + this.context = activity; + this.dTitle = dialogTitle; + this.style = style; + initColor(context); + } + + public SpinnerDialogPaged(Activity activity, ArrayList items, String dialogTitle, int style, String closeTitle) { + this.items = items; + this.context = activity; + this.dTitle = dialogTitle; + this.style = style; + this.closeTitle = closeTitle; + initColor(context); + } + + public void bindOnSpinerListener(OnSpinerItemClick onSpinerItemClick1) { + this.onSpinerItemClick = onSpinerItemClick1; + } + + public void bindOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) { + this.mOnLoadMoreListener = onLoadMoreListener; + } + + public void bindOnAfterTextChanged(OnAfterTextChangedListener onAfterTextChangedListener) { + this.onAfterTextChangedListener = onAfterTextChangedListener; + } + + public void showSpinerDialog() { + AlertDialog.Builder adb = new AlertDialog.Builder(context); + View v = context.getLayoutInflater().inflate(R.layout.dialog_layout, null); + TextView rippleViewClose = v.findViewById(R.id.close); + TextView title = v.findViewById(R.id.spinerTitle); + ImageView searchIcon = v.findViewById(R.id.searchIcon); + mProgressBar = v.findViewById(R.id.progress_bar); + 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); + if (isShowKeyboard()) { + showKeyboard(searchBox); + } + + if (isHideSearchField) { + searchIcon.setVisibility(View.INVISIBLE); + searchBox.setVisibility(View.INVISIBLE); + } + + title.setTextColor(titleColor); + searchBox.setTextColor(searchTextColor); + rippleViewClose.setTextColor(closeColor); + searchIcon.setColorFilter(searchIconColor); + + 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); + listView.setOnScrollListener(new EndlessScrollListener(visibleThreshold) { + @Override + void onLoadMore(int currentPage) { + mOnLoadMoreListener.onLoadMore(currentPage); + } + }); + adb.setView(v); + alertDialog = adb.create(); + alertDialog.getWindow().getAttributes().windowAnimations = style;//R.style.DialogAnimations_SmileWindow; + + 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 < items.size(); j++) { + if (t.getText().toString().equalsIgnoreCase(items.get(j).toString())) { + pos = j; + } + } + onSpinerItemClick.onClick(t.getText().toString(), pos); + closeSpinerDialog(); + } + }); + + searchBox.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + onAfterTextChangedListener.onAfterTextChanged(searchBox.getText().toString()); + } + }); + + rippleViewClose.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + closeSpinerDialog(); + } + }); + alertDialog.setCancelable(isCancellable()); + alertDialog.setCanceledOnTouchOutside(isCancellable()); + alertDialog.show(); + } + + public void addMoreItems(ArrayList items) { + HashSet hashSet = new HashSet<>(); + hashSet.addAll(items); + this.items.clear(); + this.items.addAll(hashSet); + + if (adapter != null) { + adapter.notifyDataSetChanged(); + } + } + + public void setVisibleThreshold(int visibleThreshold) { + this.visibleThreshold = visibleThreshold; + } + + 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); + } + + public void hideProgressBar() { + if (mProgressBar != null) { + mProgressBar.setVisibility(View.GONE); + } + } + + public void showProgressBar() { + if (mProgressBar != null) { + mProgressBar.setVisibility(View.VISIBLE); + } + } + + private boolean isCancellable() { + return cancellable; + } + + public void setHideSearchField(boolean ishideSearchField) { + this.isHideSearchField = ishideSearchField; + } + + 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 0d66209..ad3256f 100644 --- a/spinerdialog/src/main/res/layout/dialog_layout.xml +++ b/spinerdialog/src/main/res/layout/dialog_layout.xml @@ -1,10 +1,11 @@ + android:dividerHeight="0.1dp" /> + +