Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified .idea/caches/build_file_checksums.ser
Binary file not shown.
Binary file modified .idea/caches/gradle_models.ser
Binary file not shown.
2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

85 changes: 85 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,88 @@ Step 4. Add custom style in your styles.xml
</style>


# Use with pagination

Step 1. Inside JAVA

public class MainActivityPaged extends AppCompatActivity {

ArrayList<String> 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<Response>() {
@Override
public void onResponse(Call<Response> call, retrofit2.Response<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<Response> call, Throwable t) {

}
});
}


}
5 changes: 5 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'


}
8 changes: 8 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="in.galaxyofandroid.searchablespinner">

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
Expand All @@ -15,6 +22,7 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivityPaged" />
</application>

</manifest>
23 changes: 23 additions & 0 deletions app/src/main/java/in/galaxyofandroid/searchablespinner/Data.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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<String> 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<Response>() {
@Override
public void onResponse(Call<Response> call, retrofit2.Response<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<Response> call, Throwable t) {

}
});
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package in.galaxyofandroid.searchablespinner;

import java.util.List;

public class Response {

private int page;
private int total;

private List<Data> data;

public List<Data> getData() {
return data;
}

public void setData(List<Data> 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;
}
}
Original file line number Diff line number Diff line change
@@ -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> S createService(Class<S> 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);
}

}
Original file line number Diff line number Diff line change
@@ -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<Response> getUsers(@Query("page") int page);
}
Original file line number Diff line number Diff line change
@@ -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);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package in.galaxyofandroid.spinerdialog;

public interface OnAfterTextChangedListener {

void onAfterTextChanged(String term);
}
Loading