Commit c5e38b3c authored by Varun Patil's avatar Varun Patil

Fix multiple bugs in RecyclerViewFragment

1. Older articles showed up on refresh, since the existing buffer was
not cleared
2. Same articles would show up sometimes while scrolling since order of
loading was not guaranteed.
3. Repetitive calls were being made when the user reached bottom, making it
unreadable due to too many re-renders (also related to 2)
parent b200717f
...@@ -14,16 +14,17 @@ import android.view.MenuItem; ...@@ -14,16 +14,17 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import app.insti.ActivityBuffer; import app.insti.ActivityBuffer;
import app.insti.R;
import app.insti.activity.MainActivity;
import app.insti.api.RetrofitInterface; import app.insti.api.RetrofitInterface;
import app.insti.interfaces.Browsable; import app.insti.interfaces.Browsable;
import app.insti.interfaces.ItemClickListener; import app.insti.interfaces.ItemClickListener;
import app.insti.R;
import app.insti.interfaces.Readable; import app.insti.interfaces.Readable;
import app.insti.interfaces.Writable; import app.insti.interfaces.Writable;
import app.insti.activity.MainActivity;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
import retrofit2.Response; import retrofit2.Response;
...@@ -38,8 +39,12 @@ public abstract class RecyclerViewFragment<T extends Browsable, S extends Recycl ...@@ -38,8 +39,12 @@ public abstract class RecyclerViewFragment<T extends Browsable, S extends Recycl
protected SwipeRefreshLayout swipeRefreshLayout; protected SwipeRefreshLayout swipeRefreshLayout;
protected String searchQuery; protected String searchQuery;
private S adapter = null; private S adapter = null;
boolean loading = false;
private boolean allLoaded = false;
protected void updateData() { protected void updateData() {
clearPosts();
allLoaded = false;
String sessionIDHeader = ((MainActivity) getActivity()).getSessionIDHeader(); String sessionIDHeader = ((MainActivity) getActivity()).getSessionIDHeader();
RetrofitInterface retrofitInterface = ((MainActivity) getActivity()).getRetrofitInterface(); RetrofitInterface retrofitInterface = ((MainActivity) getActivity()).getRetrofitInterface();
Call<List<T>> call = getCall(retrofitInterface, sessionIDHeader); Call<List<T>> call = getCall(retrofitInterface, sessionIDHeader);
...@@ -66,6 +71,18 @@ public abstract class RecyclerViewFragment<T extends Browsable, S extends Recycl ...@@ -66,6 +71,18 @@ public abstract class RecyclerViewFragment<T extends Browsable, S extends Recycl
/* Skip if we're already destroyed */ /* Skip if we're already destroyed */
if (getActivity() == null || getView() == null) return; if (getActivity() == null || getView() == null) return;
if (adapter == null) {
initAdapter(result);
} else {
adapter.setPosts(result);
adapter.notifyDataSetChanged();
}
getActivity().findViewById(R.id.loadingPanel).setVisibility(GONE);
}
/** Initialize the adapter */
private void initAdapter(final List<T> result) {
try { try {
adapter = adapterType.getDeclaredConstructor(List.class, ItemClickListener.class).newInstance(result, new ItemClickListener() { adapter = adapterType.getDeclaredConstructor(List.class, ItemClickListener.class).newInstance(result, new ItemClickListener() {
@Override @Override
...@@ -75,52 +92,63 @@ public abstract class RecyclerViewFragment<T extends Browsable, S extends Recycl ...@@ -75,52 +92,63 @@ public abstract class RecyclerViewFragment<T extends Browsable, S extends Recycl
openWebURL(link); openWebURL(link);
} }
}); });
getActivityBuffer().safely(new ActivityBuffer.IRunnable() { initRecyclerView();
@Override
public void run(Activity pActivity) { } catch (java.lang.InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
recyclerView.setAdapter(adapter); e.printStackTrace();
recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); }
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { }
boolean loading = false;
/** Initialize scrolling on the adapter */
@Override private void initRecyclerView() {
public void onScrolled(RecyclerView recyclerView, int dx, int dy) { getActivityBuffer().safely(new ActivityBuffer.IRunnable() {
if (dy > 0) { @Override
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); public void run(Activity pActivity) {
if (((layoutManager.getChildCount() + layoutManager.findFirstVisibleItemPosition()) > (layoutManager.getItemCount() - 5)) && (!loading)) { recyclerView.setAdapter(adapter);
loading = true; recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
String sessionIDHeader = ((MainActivity) getActivity()).getSessionIDHeader(); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
RetrofitInterface retrofitInterface = ((MainActivity) getActivity()).getRetrofitInterface(); @Override
Call<List<T>> call = getCall(retrofitInterface, sessionIDHeader); public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
call.enqueue(new Callback<List<T>>() { if (dy > 0) {
@Override LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
public void onResponse(Call<List<T>> call, Response<List<T>> response) { if (((layoutManager.getChildCount() + layoutManager.findFirstVisibleItemPosition()) > (layoutManager.getItemCount() - 5)) && (!loading) && (!allLoaded)) {
if (response.isSuccessful()) { loading = true;
loading = false; String sessionIDHeader = ((MainActivity) getActivity()).getSessionIDHeader();
List<T> posts = adapter.getPosts(); RetrofitInterface retrofitInterface = ((MainActivity) getActivity()).getRetrofitInterface();
posts.addAll(response.body()); Call<List<T>> call = getCall(retrofitInterface, sessionIDHeader);
if (response.body().size() == 0) { call.enqueue(new Callback<List<T>>() {
showLoader = false; @Override
} public void onResponse(Call<List<T>> call, Response<List<T>> response) {
adapter.setPosts(posts); if (getActivity() == null || getView() == null) return;
adapter.notifyDataSetChanged(); loading = false;
if (response.isSuccessful()) {
List<T> posts = adapter.getPosts();
posts.addAll(response.body());
if (response.body().size() == 0) {
showLoader = false;
allLoaded = true;
} }
adapter.setPosts(posts);
adapter.notifyDataSetChanged();
} }
}
@Override @Override
public void onFailure(Call<List<T>> call, Throwable t) { public void onFailure(Call<List<T>> call, Throwable t) {
loading = false; loading = false;
} }
}); });
}
} }
} }
}); }
} });
}); }
getActivity().findViewById(R.id.loadingPanel).setVisibility(GONE); });
} catch (java.lang.InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { }
e.printStackTrace();
protected void clearPosts() {
if (adapter != null) {
adapter.setPosts(new ArrayList<T>());
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment