Initial work on paging the activities list

This commit is contained in:
Mark Anderson 2015-05-27 23:23:57 +01:00
parent 18e2124514
commit 673f9e99bd
4 changed files with 88 additions and 23 deletions

View file

@ -12,8 +12,6 @@ import com.newsblur.domain.UserDetails;
import com.newsblur.fragment.ProfileActivityFragment;
import com.newsblur.fragment.ProfileDetailsFragment;
import com.newsblur.network.APIManager;
import com.newsblur.domain.ActivityDetails;
import com.newsblur.network.domain.ActivitiesResponse;
import com.newsblur.network.domain.ProfileResponse;
import com.newsblur.util.PrefsUtils;
@ -73,7 +71,6 @@ public class Profile extends NbActivity {
private class LoadUserTask extends AsyncTask<Void, Void, Void> {
private UserDetails user;
private ActivityDetails[] activities;
@Override
protected void onPreExecute() {
@ -88,7 +85,6 @@ public class Profile extends NbActivity {
String intentUserId = getIntent().getStringExtra(USER_ID);
profileResponse = apiManager.getUser(intentUserId);
user = profileResponse.user;
activities = apiManager.getActivities(intentUserId).activities;
} else {
apiManager.updateUserProfile();
user = PrefsUtils.getUserDetails(Profile.this);
@ -96,10 +92,6 @@ public class Profile extends NbActivity {
// have failed then user.id == null would cause a force close
if (user.id != null) {
profileResponse = apiManager.getUser(user.id);
ActivitiesResponse activitiesResponse = apiManager.getActivities(user.id);
if (activitiesResponse != null) {
activities = activitiesResponse.activities;
}
}
}
return null;
@ -109,10 +101,7 @@ public class Profile extends NbActivity {
protected void onPostExecute(Void result) {
if (user != null && detailsFragment != null && activitiesFragment != null) {
detailsFragment.setUser(Profile.this, user, TextUtils.isEmpty(userId));
// activities could be null if no profile response was received
if (activities != null) {
activitiesFragment.setActivitiesAndUser(Profile.this, activities, user);
}
activitiesFragment.setUser(Profile.this, user);
}
}
}

View file

@ -1,26 +1,33 @@
package com.newsblur.fragment;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ListView;
import com.newsblur.R;
import com.newsblur.domain.UserDetails;
import com.newsblur.domain.ActivityDetails;
import com.newsblur.network.APIManager;
import com.newsblur.network.domain.ActivitiesResponse;
import com.newsblur.view.ActivitiesAdapter;
public class ProfileActivityFragment extends Fragment {
private ListView activityList;
ActivitiesAdapter adapter;
private ActivitiesAdapter adapter;
private APIManager apiManager;
private UserDetails user;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
apiManager = new APIManager(getActivity());
}
@Override
@ -30,17 +37,89 @@ public class ProfileActivityFragment extends Fragment {
if (adapter != null) {
displayActivities();
}
activityList.setOnScrollListener(new EndlessScrollListener());
return v;
}
public void setActivitiesAndUser(Context context, final ActivityDetails[] activities, UserDetails user ) {
// Set the activities, create the adapter
adapter = new ActivitiesAdapter(context, activities, user);
public void setUser(Context context, UserDetails user) {
// TODO reset the page number in the listener for new user?
this.user = user;
adapter = new ActivitiesAdapter(context, user);
displayActivities();
}
private void displayActivities() {
activityList.setAdapter(adapter);
loadPage(1);
}
private void loadPage(final int pageNumber) {
// TODO progress indicator
// TODO pass limit?
new AsyncTask<Void, Void, ActivityDetails[]>() {
@Override
protected ActivityDetails[] doInBackground(Void... voids) {
ActivitiesResponse activitiesResponse = apiManager.getActivities(user.id, pageNumber);
if (activitiesResponse != null) {
return activitiesResponse.activities;
} else {
return new ActivityDetails[0];
}
}
@Override
protected void onPostExecute(ActivityDetails[] result) {
for (ActivityDetails activity : result) {
adapter.add(activity);
}
adapter.notifyDataSetChanged();
}
}.execute();
}
/**
* Detects when user is close to the end of the current page and starts loading the next page
* so the user will not have to wait (that much) for the next entries.
*
* @author Ognyan Bankov
*
* https://github.com/ogrebgr/android_volley_examples/blob/master/src/com/github/volley_examples/Act_NetworkListView.java
*/
public class EndlessScrollListener implements AbsListView.OnScrollListener {
// how many entries earlier to start loading next page
private int visibleThreshold = 5;
private int currentPage = 1;
private int previousTotal = 0;
private boolean loading = true;
public EndlessScrollListener() {
}
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.
loadPage(currentPage);
loading = true;
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
}
}

View file

@ -438,10 +438,11 @@ public class APIManager {
}
}
public ActivitiesResponse getActivities(String userId) {
public ActivitiesResponse getActivities(String userId, int pageNumber) {
final ContentValues values = new ContentValues();
values.put(APIConstants.PARAMETER_USER_ID, userId);
values.put(APIConstants.PARAMETER_LIMIT, "10");
values.put(APIConstants.PARAMETER_PAGE_NUMBER, Integer.toString(pageNumber));
final APIResponse response = get(APIConstants.URL_USER_ACTIVITIES, values);
if (!response.isError()) {
ActivitiesResponse activitiesResponse = (ActivitiesResponse) response.getResponse(gson, ActivitiesResponse.class);

View file

@ -35,16 +35,12 @@ public class ActivitiesAdapter extends ArrayAdapter<ActivityDetails> {
private Context context;
private UserDetails currentUserDetails;
public ActivitiesAdapter(final Context context, final ActivityDetails[] activities, UserDetails user) {
public ActivitiesAdapter(final Context context, UserDetails user) {
super(context, R.id.row_activity_text);
inflater = LayoutInflater.from(context);
imageLoader = ((NewsBlurApplication) context.getApplicationContext()).getImageLoader();
this.context = context;
for (ActivityDetails response : activities) {
add(response);
}
currentUserDetails = user;
Resources resources = context.getResources();