Skip to content

Instantly share code, notes, and snippets.

@selmanon
Created June 26, 2014 17:32
Show Gist options
  • Save selmanon/b239d10ed2fc8b8724fc to your computer and use it in GitHub Desktop.
Save selmanon/b239d10ed2fc8b8724fc to your computer and use it in GitHub Desktop.
SwipeToRefreshLayout with support lib
package pro.businessbook.fragments;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import pro.businessbook.MainApplication;
import pro.businessbook.R;
import pro.businessbook.adapters.ProfessionnelAdapter;
import pro.businessbook.beans.Profil;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.ListFragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import com.nhaarman.listviewanimations.itemmanipulation.OnDismissCallback;
import com.nhaarman.listviewanimations.itemmanipulation.swipedismiss.SwipeDismissAdapter;
import com.nhaarman.listviewanimations.swinginadapters.prepared.SwingBottomInAnimationAdapter;
public class ProfessionnelFragment extends ListFragment implements SwipeRefreshLayout.OnRefreshListener, OnDismissCallback {
ListView listViewProfessionels;
List<Profil> pages,pagesToAdd;
View rootView;
ProfessionnelAdapter adapter;
private SwipeRefreshLayout refreshLayout;
static int from;
static String requestFilter;
boolean scroll = true;
int offset = 8;
// USED FOR ENDLESS LISTVIEW
private View footer;
//private boolean isLoading;
public ProfessionnelFragment(int i,String filtre) {
this.from = i;
this.requestFilter = filtre;
}
public static ProfessionnelFragment newInstance() {
ProfessionnelFragment fragment = new ProfessionnelFragment(from,requestFilter);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_professionel, container, false);
refreshLayout = (SwipeRefreshLayout)view.findViewById(R.id.swipe_container);
refreshLayout.setOnRefreshListener(this);
//view.setPadding(0,0, 0, 50);
setAppearance();
return view;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onDestroyView() {
super.onDestroyView();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(from!=1){
getActivity().findViewById(R.id.bottom_bar).setVisibility(View.VISIBLE);
getActivity().findViewById(R.id.bottom_bar_rechercher).setVisibility(View.GONE);
getActivity().findViewById(R.id.main_activity_linear_layout).setVisibility(View.GONE);
this.setLoadingView(R.layout.loading_layout);
}
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
try {
HttpHeaders requestHeaders = new HttpHeaders();
List<MediaType> acceptableMedia = new ArrayList<MediaType>();
acceptableMedia.add(MediaType.APPLICATION_JSON);
requestHeaders.setAccept(acceptableMedia);
HttpEntity< ?> requestEntity = new HttpEntity<Object>(requestHeaders);
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
ResponseEntity<Profil[]> responseEntity;
if(from==1){
responseEntity = restTemplate.exchange("http://www.businessbook.pro/api/v1/profils.json"+requestFilter, HttpMethod.GET, requestEntity, Profil[].class);
pages = new LinkedList(Arrays.asList(responseEntity.getBody()));
}
else
{
//responseEntity = restTemplate.exchange("http://www.businessbook.pro/api/v1/profils.json", HttpMethod.GET, requestEntity, Profil[].class);
pages = new LinkedList(Arrays.asList(MainApplication.getProfils()));
}
//pages = new LinkedList(Arrays.asList(responseEntity.getBody()));
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
adapter = new ProfessionnelAdapter(getActivity(),pages);
SwingBottomInAnimationAdapter swingBottomInAnimationAdapter;
swingBottomInAnimationAdapter = new SwingBottomInAnimationAdapter(new SwipeDismissAdapter(adapter, ProfessionnelFragment.this));
swingBottomInAnimationAdapter.setInitialDelayMillis(300);
swingBottomInAnimationAdapter.setAbsListView(getListView());
getListView().setAdapter(swingBottomInAnimationAdapter);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
if(from!=1)
getListView().setOnScrollListener(new EndlessListScrollListener());
}
@Override
public void onResume() {
super.onResume();
}
private void setAppearance() {
refreshLayout.setColorScheme(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
}
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override public void run() {
refreshLayout.setRefreshing(false);
}
}, 5000);
}
@Override
public void onDismiss(AbsListView absListView, int[] ints) {
}
/**
* Listener which handles the endless list. It is responsible for
* determining when the long service will be called asynchronously.
*/
class EndlessListScrollListener implements OnScrollListener {
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
boolean loadMore = /* maybe add a padding */
firstVisibleItem + visibleItemCount >= totalItemCount;
if(pages!=null & adapter!=null && scroll){
if(loadMore) {
// It is time to add new data. We call the listener
getListView().addFooterView(footer);
new RequestTask().execute("http://www.businessbook.pro/api/v1/profils.json?limit=2&offset="+(offset+=2));
// getActivity().runOnUiThread(new Runnable() {
// public void run() {
// //adapter.notifyDataSetChanged();
// mHandler.postDelayed(mAddItemsRunnable, 1);
// }
// });
}
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
}
class RequestTask extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... uri) {
android.os.Debug.waitForDebugger();
try {
scroll = false;
HttpHeaders requestHeaders = new HttpHeaders();
List<MediaType> acceptableMedia = new ArrayList<MediaType>();
acceptableMedia.add(MediaType.APPLICATION_JSON);
requestHeaders.setAccept(acceptableMedia);
HttpEntity< ?> requestEntity = new HttpEntity<Object>(requestHeaders);
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
ResponseEntity<Profil[]> responseEntity = restTemplate.exchange(uri[0], HttpMethod.GET, requestEntity, Profil[].class);
pagesToAdd = new LinkedList(Arrays.asList(responseEntity.getBody()));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
android.os.Debug.waitForDebugger();
pages.addAll(pagesToAdd);
pages.size();
//mHandler.postDelayed(mAddItemsRunnable, 1);
if(pagesToAdd.size()>0){
adapter.addMoreItems(2, pages);
getListView().removeFooterView(footer);
scroll = true;
}
else {
scroll = false;
}
}
}
public void setLoadingView(int resId) {
LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
footer = (View) inflater.inflate(resId, null);
this.getListView().addFooterView(footer);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment