0

i wnat to integrate endlessrecyclerview with web seervice data in GridLayoutManager so below is my code

public class GridRecycle extends AppCompatActivity {

RecyclerView mRecyclerView;
private GridLayoutManager mLayoutManager;
ArrayList<GetProductListing.ListingBlock>rowListItem;
GetProductListing mGetProductListing;
PostParseGet mPostParseGet;
int pager=1;
RecyclerViewAdapter rcAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_gird);
    rowListItem=new ArrayList<>();
    mPostParseGet=new PostParseGet(GridRecycle.this);
    mGetProductListing=new GetProductListing();
    mRecyclerView=(RecyclerView)findViewById(R.id.recycler_view);
    mLayoutManager = new GridLayoutManager(GridRecycle.this, 2 );

    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(mLayoutManager);
    new getData().execute();



    mRecyclerView.setOnScrollListener(new EndlessRecyclerOnScrollListener(
            mLayoutManager) {
        @Override
        public void onLoadMore(int current_page) {
            pager++;
            new getData().execute();
        }

    });
}

public class getData extends AsyncTask<Void,Void,Void>
{

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... voids) {
        mGetProductListing=(GetProductListing)mPostParseGet.getProductDataWithSlug(mGetProductListing,pager);

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        if (mGetProductListing.getListing().getData().size()>0)
        {
            rowListItem=getProductBlock();
            rcAdapter= new RecyclerViewAdapter(GridRecycle.this, Tags.mAllListingBlocks);
            mRecyclerView.setAdapter(rcAdapter);
            rcAdapter.notifyDataSetChanged();
        }
    }
}
public ArrayList<GetProductListing.ListingBlock> getProductBlock() {
    ArrayList<GetProductListing.ListingBlock> mArrayListParserLog = new ArrayList<GetProductListing.ListingBlock>();


    for (int i = 0; i < mGetProductListing.getListing().getData().size(); i++) {
        GetProductListing.ListingBlock mParserLog = new GetProductListing.ListingBlock();

        mParserLog.setId(mGetProductListing.getListing().getData().get(i).getId());
        mParserLog.setTitle(mGetProductListing.getListing().getData().get(i).getTitle());
        mParserLog.setDiscountSale(mGetProductListing.getListing().getData().get(i).getDiscountSale());
        mParserLog.setDiscountSelling(mGetProductListing.getListing().getData().get(i).getDiscountSelling());
        mParserLog.setPrice(mGetProductListing.getListing().getData().get(i).getPrice());
        mParserLog.setSale_end(mGetProductListing.getListing().getData().get(i).getSale_end());
        if (mGetProductListing.getListing().getData().get(i).getSale_price()!=null && !mGetProductListing.getListing().getData().get(i).getSale_price().isEmpty())
        {
            mParserLog.setSale_price(mGetProductListing.getListing().getData().get(i).getSale_price());

        }
        else
        {
            mParserLog.setSale_price("0");

        }
        mParserLog.setSale_start(mGetProductListing.getListing().getData().get(i).getSale_start());
        mParserLog.setSelling_price(mGetProductListing.getListing().getData().get(i).getSelling_price());
        mParserLog.setProduct_rating(mGetProductListing.getListing().getData().get(i).getProduct_rating());
        mParserLog.setSlug(mGetProductListing.getListing().getData().get(i).getSlug());
        mParserLog.setSold_out(mGetProductListing.getListing().getData().get(i).getSold_out());
        mParserLog.setImage(mGetProductListing.getListing().getData().get(i).getImage());
        mParserLog.setSku_id(mGetProductListing.getListing().getData().get(i).getSku_id());
        mParserLog.setMedium_image(mGetProductListing.getListing().getData().get(i).getMedium_image());
        mArrayListParserLog.add(mParserLog);
        Tags.mAllListingBlocks.add(mParserLog);

    }
    return mArrayListParserLog;
}

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolders> {

    private List<GetProductListing.ListingBlock> itemList;
    private Context context;

    public RecyclerViewAdapter(Context context, List<GetProductListing.ListingBlock> itemList) {
        this.itemList = itemList;
        this.context = context;
    }

    @Override
    public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {

        View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_reow, null);
        RecyclerViewHolders rcv = new RecyclerViewHolders(layoutView);
        return rcv;
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolders holder, final int position) {
        holder.name.setText(itemList.get(position).getTitle());
        holder.price.setText(itemList.get(position).getPrice());


    }

    @Override
    public int getItemCount() {
        return this.itemList.size();
      }
   }
 }

EndlessRecyclerOnScrollListener.java

public abstract class EndlessRecyclerOnScrollListener extends
    RecyclerView.OnScrollListener {
public static String TAG = EndlessRecyclerOnScrollListener.class
        .getSimpleName();

private int previousTotal = 0;
private boolean loading = true;
private int visibleThreshold = 5;
int firstVisibleItem, visibleItemCount, totalItemCount;

private int current_page = 1;

private LinearLayoutManager mLinearLayoutManager;

public EndlessRecyclerOnScrollListener(
        LinearLayoutManager linearLayoutManager) {
    this.mLinearLayoutManager = linearLayoutManager;
}

@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    super.onScrolled(recyclerView, dx, dy);

    visibleItemCount = recyclerView.getChildCount();
    totalItemCount = mLinearLayoutManager.getItemCount();
    firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();

    if (loading) {
        if (totalItemCount > previousTotal) {
            loading = false;
            previousTotal = totalItemCount;
        }
    }
    if (!loading
            && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
        // End has been reached

        // Do something
        current_page++;

        onLoadMore(current_page);

        loading = true;
    }
  }

 public abstract void onLoadMore(int current_page);
}

when i run above code and scroll down at that time my recycleview focus at top again and again not scrolling down continuously? so any idea how can i solve this problem ? your all suggestions are appreciable

  • In onPostExecute event, you are always creating new RecyclerViewAdapter and setting with recyclerview. Thats why it is happening. I have answered below, please check it. – Sabari May 30 '16 at 12:30

3 Answers3

0

Use addOnScrollListener() instead of setOnScrollListener()

listRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);


        }
    });
YLS
  • 1,475
  • 2
  • 15
  • 35
  • YLS : i tried your code but when implement it it will blink every time my data untill my service data not loaded with pagination completely –  May 30 '16 at 12:15
  • show progressbar when it loads data from service, and remove this line rcAdapter= new RecyclerViewAdapter(GridRecycle.this, Tags.mAllListingBlocks); mRecyclerView.setAdapter(rcAdapter); and add only rcAdapter.notifyDataSetChanged(); adapter should be created only one time not every time – YLS May 31 '16 at 06:55
  • Thanks for your time and effort i make little bit changes in my code and some java file i get result which i want so +1 for your efforts –  May 31 '16 at 09:32
0

Remove following 2 lines from class getData->onPostExecute.

rcAdapter= new RecyclerViewAdapter(GridRecycle.this, Tags.mAllListingBlocks);
            mRecyclerView.setAdapter(rcAdapter);

and add those lines(above 2 lines) in GridRecycle.java-> onCreate, below this line

mRecyclerView.setLayoutManager(mLayoutManager);
Sabari
  • 1,963
  • 1
  • 13
  • 10
  • I tryied your code but it is scroll only 1 time when i scroll down my service is not call –  May 30 '16 at 13:14
  • @Hardy Oh I see, I think it is because of "itemList" in RecyclerViewAdapter class is not updating. Could you please use "Tags.mAllListingBlocks" instead of "itemList" in RecyclerViewAdapter and try again. – Sabari May 31 '16 at 04:25
  • Thanks for your time and effort i make little bit changes in my code and some java file i get result which i want so +1 for your efforts –  May 31 '16 at 09:32
0

I Solve my problem

public abstract class EndlessRecyclerGridOnScrollListener extends
RecyclerView.OnScrollListener {
public static String TAG = EndlessRecyclerGridOnScrollListener.class
    .getSimpleName();

  private int previousTotal = 0;
  private boolean loading = true;
  private int visibleThreshold = 5;
   int firstVisibleItem, visibleItemCount, totalItemCount;

   private int current_page = 1;

  private GridLayoutManager mLinearLayoutManager;

   public EndlessRecyclerGridOnScrollListener(
    GridLayoutManager linearLayoutManager) {
  this.mLinearLayoutManager = linearLayoutManager;
 }

  @Override
 public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
 super.onScrolled(recyclerView, dx, dy);

visibleItemCount = recyclerView.getChildCount();
totalItemCount = mLinearLayoutManager.getItemCount();
firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();

if (loading) {
    if (totalItemCount > previousTotal) {
        loading = false;
        previousTotal = totalItemCount;
    }
}
if (!loading
        && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
    // End has been reached

    // Do something
    current_page++;

    onLoadMore(current_page);

    loading = true;
   }
 }

  public abstract void onLoadMore(int current_page);
 }

in GridRecycle.java file

mGridView.setOnScrollListener(new EndlessRecyclerGridOnScrollListener(
        mLayoutManagerGrid) {
    @Override
    public void onLoadMore(int current_page) {
        if (Tags.mArrayListingAllProductBlocks.size() < totalitem) {
            page++;
            new productList().execute();
        }
    }

});

And remove 2 line in onPost method

rcAdapter= new RecyclerViewAdapter(GridRecycle.this, Tags.mAllListingBlocks);
mRecyclerView.setAdapter(rcAdapter);