重复值附加在recycleview多视图android分页

时间:2017-02-28 04:36:11

标签: android pagination android-recyclerview recycler-adapter

我将recycleview与多个视图集成,所以下面是我的代码

public class ActivityProdcutListWithMulipleView extends AppCompatActivity {

RecyclerView mRecyclerView;
Toolbar mToolbar;
PostParseGet mPostParseGet;
AllMethods mAllMethods;
GetProductListing mGetProductListing;
RecyclerView.LayoutManager mLayoutManager;
ProgressDialog mProgressDialog;
int page = 1;
int total = 0;
int totalFeature = 0;
int totalbanner = 0;
ImageView mImageViewBack;
ArrayList<GetProductListing.ListingBlock> mListingBlocks;
ArrayList<GetProductListing.ListingBlock> mListingBlocksFeature;
ArrayList<GetProductListing.ListingBlock> mListingBlocksBanner;

ArrayList<OrderItemDemo> mOrderItemDemos = new ArrayList<OrderItemDemo>();
GridLayoutManager mLayoutManagerGrid;
DifferentRowAdapter adapter;
private Handler handler;
ArrayList<GetProductListing.ListingBlock> adapterData;
public static Activity mActivity;

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_product_list);
    mListingBlocks = new ArrayList<>();
    mActivity = this;
    mListingBlocksFeature = new ArrayList<>();
    mListingBlocksBanner = new ArrayList<>();

    mRecyclerView = (RecyclerView) findViewById(R.id.recycle);
    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    mImageViewBack = (ImageView) mToolbar.findViewById(R.id.imgBack);
    WebAPIApplication.mArrayListingAllProductBlocks.clear();
    mPostParseGet = new PostParseGet(ActivityProdcutListWithMulipleView.this);
    mAllMethods = new AllMethods(ActivityProdcutListWithMulipleView.this);
    mGetProductListing = new GetProductListing();
    mLayoutManagerGrid = new GridLayoutManager(ActivityProdcutListWithMulipleView.this, 2);
    mLayoutManager = new LinearLayoutManager(ActivityProdcutListWithMulipleView.this);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(mLayoutManagerGrid);
    handler = new Handler();
    adapterData = new ArrayList<>();


    mRecyclerView.addOnScrollListener(new EndlessRecyclerGridOnScrollListener(mLayoutManagerGrid) {
        @Override
        public void onLoadMore(int current_page) {
            if (WebAPIApplication.mArrayListingAllProductBlocks.size() < total) {

                page++;
                new getProductData(false, true).execute();
            }
        }
    });

    adapter = new DifferentRowAdapter(mOrderItemDemos);
    mRecyclerView.setAdapter(adapter);


    mLayoutManagerGrid.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            return adapter.getItemViewType(position) == OrderItemDemo.BANNER_TYPE ? 2 : 1;
        }
    });

    if (mAllMethods.check_Internet() == true) {
        new getProductData(true, false).execute();
    } else {
        mAllMethods.ShowDialog(ActivityProdcutListWithMulipleView.this, "", getString(R.string.net_not_available), "OK");
    }
    mImageViewBack.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            finish();
        }
    });
}


public static class DifferentRowAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private int visibleThreshold = 5;
    private int lastVisibleItem, totalItemCount;
    private boolean loading;
    boolean isLoading = false, isMoreDataAvailable = true;
    private List<OrderItemDemo> mList;
    OnLoadMoreListener loadMoreListener;


    public DifferentRowAdapter(List<OrderItemDemo> list) {
        this.mList = list;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view;

        switch (viewType) {
            case OrderItemDemo.NORMAL_TYPE:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_list_file, parent, false);
                return new ProductListRow(view);
            case OrderItemDemo.FEATURE_TYPE:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_list_feature_file, parent, false);
                return new ProductListRow(view);
            case OrderItemDemo.BANNER_TYPE:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_list_file, parent, false);
                return new ProductListRow(view);
        }
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
            isLoading = true;
            loadMoreListener.onLoadMore();
        }

        final OrderItemDemo object = mList.get(position);
        if (object != null) {
            switch (object.getmType()) {
                case OrderItemDemo.NORMAL_TYPE:
                    ((ProductListRow) holder).name.setText(object.getId() + " " + object.getTitle());
                    ((ProductListRow) holder).price.setText(object.getType());

                    Picasso.with(mActivity)
                            .load(object.getImage())
                            .into(((ProductListRow) holder).mImageViewProduct);
                    ((ProductListRow) holder).mImageViewBanner.setVisibility(View.GONE);
                    ((ProductListRow) holder).mRelativeLayout.setVisibility(View.VISIBLE);
                    break;
                case OrderItemDemo.FEATURE_TYPE:
                    ((ProductListRow) holder).name.setText(object.getId() + " " + object.getTitle());
                    ((ProductListRow) holder).price.setText(object.getType());
                    ((ProductListRow) holder).mImageViewBanner.setVisibility(View.GONE);
                    ((ProductListRow) holder).mRelativeLayout.setVisibility(View.VISIBLE);
                    Picasso.with(mActivity)
                            .load(object.getImage())
                            .into(((ProductListRow) holder).mImageViewProduct);
                    break;
                case OrderItemDemo.BANNER_TYPE:
                    ((ProductListRow) holder).price.setText(object.getType());
                    ((ProductListRow) holder).mImageViewBanner.setVisibility(View.VISIBLE);
                    ((ProductListRow) holder).mRelativeLayout.setVisibility(View.GONE);

                    break;
            }
        }
    }


    public void setMoreDataAvailable(boolean moreDataAvailable) {
        isMoreDataAvailable = moreDataAvailable;
    }


    public void notifyDataChanged() {
        notifyDataSetChanged();
        isLoading = false;
    }


    interface OnLoadMoreListener {
        void onLoadMore();
    }

    public void setLoadMoreListener(OnLoadMoreListener loadMoreListener) {
        this.loadMoreListener = loadMoreListener;
    }


    @Override
    public int getItemCount() {
        if (mList == null)
            return 0;
        return mList.size();
    }

    @Override
    public int getItemViewType(int position) {
        if (mList != null) {
            OrderItemDemo object = mList.get(position);
            if (object != null) {
                return object.getmType();
            }
        }
        return 0;
    }


}

public abstract class EndlessRecyclerGridOnScrollListener extends
        RecyclerView.OnScrollListener {
    public 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 LinearLayoutManager 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();
        visibleThreshold = total;
        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);
}


public class getProductData extends AsyncTask<Void, Void, Void> {
    boolean showLoading;
    boolean pagination;

    public getProductData(boolean showLoading, boolean page) {
        this.showLoading = showLoading;
        this.pagination = page;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        if (showLoading == true) {
            mProgressDialog = ProgressDialog.show(ActivityProdcutListWithMulipleView.this, "", "Loading..");
        }
    }

    @Override
    protected Void doInBackground(Void... voids) {
        mGetProductListing = (GetProductListing) mPostParseGet.getTopSearchData(mGetProductListing, page);
        return null;

    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        if (showLoading == true) {
            if (mProgressDialog != null) {
                mProgressDialog.dismiss();
            }
        }
        if (mGetProductListing != null) {
            try {
                total = Integer.parseInt(mGetProductListing.getListing().getTotal());
                if (mGetProductListing.getListing().getData().size() > 0) {
                    mListingBlocks = getProductBlock();
                    Log.e("FeatureSize", String.valueOf(mListingBlocksFeature.size()));
                    Log.e("BannerSize", String.valueOf(mListingBlocksBanner.size()));

                    for (int i = 0; i < WebAPIApplication.mArrayListingAllProductBlocks.size(); i++) {

                        if (WebAPIApplication.mArrayListingAllProductBlocks.get(i).getType().equalsIgnoreCase("product")) {
                            mOrderItemDemos.add(new OrderItemDemo(WebAPIApplication.mArrayListingAllProductBlocks.get(i).getId(), WebAPIApplication.mArrayListingAllProductBlocks.get(i).getTitle(), WebAPIApplication.mArrayListingAllProductBlocks.get(i).getType(), WebAPIApplication.mArrayListingAllProductBlocks.get(i).getMedium_image(), OrderItemDemo.NORMAL_TYPE));
                        } else if (WebAPIApplication.mArrayListingAllProductBlocks.get(i).getType().equalsIgnoreCase("featured")) {
                            mOrderItemDemos.add(new OrderItemDemo(WebAPIApplication.mArrayListingAllProductBlocks.get(i).getId(), WebAPIApplication.mArrayListingAllProductBlocks.get(i).getTitle(), WebAPIApplication.mArrayListingAllProductBlocks.get(i).getType(), WebAPIApplication.mArrayListingAllProductBlocks.get(i).getMedium_image(), OrderItemDemo.FEATURE_TYPE));
                        } else {
                            mOrderItemDemos.add(new OrderItemDemo(WebAPIApplication.mArrayListingAllProductBlocks.get(i).getId(), WebAPIApplication.mArrayListingAllProductBlocks.get(i).getTitle(), WebAPIApplication.mArrayListingAllProductBlocks.get(i).getType(), WebAPIApplication.mArrayListingAllProductBlocks.get(i).getMedium_image(), OrderItemDemo.BANNER_TYPE));
                        }
                    }

                    adapter = new DifferentRowAdapter(mOrderItemDemos);
                    if (pagination == false) {
                        mRecyclerView.setAdapter(adapter);
                    }
                    adapter.notifyDataSetChanged();

                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }
}

/*Get Product data  */
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.setType(mGetProductListing.getListing().getData().get(i).getType());
        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.setAupc(mGetProductListing.getListing().getData().get(i).getAupc());
        mParserLog.setSale_end(mGetProductListing.getListing().getData().get(i).getSale_end());
        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);
        WebAPIApplication.mArrayListingAllProductBlocks.add(mParserLog);


    }
    return mArrayListParserLog;
  }


}

当我在第一页上面的代码上面运行时,我得到了正确的值,但是当我在那时调用第二页时,第一页的值将再次附加第二页数据,所以任何想法如何解决这个问题?你的所有建议都很明显

1 个答案:

答案 0 :(得分:0)

在将更新的数据加载到ArrayList之前尝试arraylist.clear()以避免重复值。

1. 在Oncreate之前添加此代码

ArrayList<GetProductListing.ListingBlock> mArrayListParserLog = new ArrayList<GetProductListing.ListingBlock>(); 

并将其从 getProductBlock()

中删除
  1. 添加mArrayListParserLog.clear();使用getProductBlock()方法

    public ArrayList<GetProductListing.ListingBlock> getProductBlock(){
    mArrayListParserLog.clear();