如何实现gridview的无尽滚动监听器



我一直在尝试为我的电子商务应用程序的产品列表页面实现无尽的滚动功能。网格显示了项目的详细信息,当我滚动到底部时,我需要显示一个进度条,然后添加新的项目网格。

api调用是这样工作的,我需要发送start_row_number和limit,这将向我发送start_row_number到limit的所有项目。例如:start_row_number = 0, limit = 10。这将返回从0到10的项

之后,当用户到达网格底部时,我需要加载更多的项目,并将其附加到gridview。所以我将发送start_row_number = 10和limit = 10,这将返回从10到20的项目。

到目前为止,我可以获得从0到10的项目,但不能在此之后。我怎样才能创建无尽的滚动功能,使一切都这样,它不会给我错误,如"主线程上太多的工作"

这是我的MainActivity:

public class ProductListing extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.product_listing_act);
    init();
}
public void productListingApiCall(ProductListingCondtionModel productListingCondtionModel) {
    RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(productListingCondtionModel.getBase_url()).setLogLevel(RestAdapter.LogLevel.FULL).build();
    final ProductListingApi productListingApi =
            restAdapter.create(ProductListingApi.class);
    productListingApi.getFeed(productListingCondtionModel.getFile(),
            productListingCondtionModel.getOperation_condition(),
            productListingCondtionModel.getSearch_string_condition(),
            productListingCondtionModel.getMinprice_condition(),
            productListingCondtionModel.getMaxprice_condition(),
            productListingCondtionModel.getMincusratings_condition(),
            productListingCondtionModel.getMaxcusratings_condition(),
            productListingCondtionModel.getDiscount_condition(),
            productListingCondtionModel.getCatids_condition(),
            productListingCondtionModel.getBrands_condition(),
            productListingCondtionModel.getAffids_condition(),
            productListingCondtionModel.getStart_row_condition(),
            productListingCondtionModel.getLimit(),
            productListingCondtionModel.getOrderby_condition(),
            productListingCondtionModel.getSortby_condition(), new Callback<ProductListingPojo>() {
                @Override
                public void success(ProductListingPojo productListingPojo, Response response) {
                    final ProductListingPojo product = productListingPojo;
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            String[] t = Arrays.copyOf(product.getTitle(),
                                    product.getTitle().length);
                            int[] p = Arrays.copyOf(product.getSellingprice(),
                                    product.getSellingprice().length);
                            int[] m = Arrays.copyOf(product.getMrp(),
                                    product.getMrp().length);
                            int[] d = Arrays.copyOf(product.getDiscountpercent(),
                                    product.getDiscountpercent().length);
                            String[] i = Arrays.copyOf(product.getProductimageSmall1(),
                                    product.getProductimageSmall1().length);

                            for(int j = 0; j < t.length; j++) {
                                CategoryAllApi categoryAllApi = new CategoryAllApi();
                                categoryAllApi.setTitle(t[j]);
                                categoryAllApi.setPrice(p[j]);
                                categoryAllApi.setMrp(m[j]);
                                categoryAllApi.setDiscount(d[j]);
                                categoryAllApi.setImage(i[j]);
                                arrayList.add(categoryAllApi);
                            }

                        }
                    }).run();
                    setAdapter();
                }
                @Override
                public void failure(RetrofitError error) {
                    tv_title_header.setText(error.getMessage());
                    Log.e("error", error.getMessage());
                }
            });
}
void setAdapter() {
    adapter = new ProductListingGridAdapter(this, arrayList);
    gv_product_listing_act.setAdapter(adapter);
}
}

这里是适配器:

public class ProductListingGridAdapter extends BaseAdapter {
public ProductListingGridAdapter(ProductListing productListing, ArrayList<CategoryAllApi> arrayList) {
    this.arrayList= arrayList;
    context = productListing;
    inflater = ( LayoutInflater )context.
            getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
    return arrayList.size();
}
@Override
public Object getItem(int position) {
    return position;
}
@Override
public long getItemId(int position) {
    return position;
}
public class Holder
{
    ImageView im_pic;
    TextView tv_title, tv_price, tv_mrp, tv_discount;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    GridView grid = (GridView) parent;
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    int width = metrics.widthPixels;
    grid.setColumnWidth(width);
    grid.setNumColumns(2);
    int size = grid.getRequestedColumnWidth() / 2 ;
    Double d = new Double(size * 2);
    int h = d.intValue();
    Holder holder = new Holder();
    View rowView;

    int index = grid.getFirstVisiblePosition();
    View v = grid.getChildAt(0);
    int top = (v == null) ? 0 : (v.getTop() - grid.getPaddingTop());
    grid.setSelectionFromTop(index, top);
    rowView = inflater.inflate(R.layout.product_listing_gv_items_lay, null);
    rowView.setLayoutParams(new GridView.LayoutParams(size, h));
    holder.im_pic = (ImageView) rowView.findViewById(R.id.im_product_listing_gv_items_lay_pic);
    holder.tv_title = (TextView) rowView.findViewById(R.id.tv_product_listing_gv_items_lay_title);
    holder.tv_price = (TextView) rowView.findViewById(R.id.tv_product_listing_gv_items_lay_price);
    holder.tv_mrp = (TextView) rowView.findViewById(R.id.tv_product_listing_gv_items_lay_mrp);
    holder.tv_discount = (TextView) rowView.findViewById(R.id.tv_product_listing_gv_items_lay_discount);
    holder.tv_title.setTypeface(EasyFonts.robotoMedium(rowView.getContext()));
    holder.tv_price.setTypeface(EasyFonts.robotoBlack(rowView.getContext()));
    holder.tv_mrp.setTypeface(EasyFonts.robotoLight(rowView.getContext()));
    holder.tv_mrp.setPaintFlags(holder.tv_mrp.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
    holder.tv_discount.setTypeface(EasyFonts.robotoLight(rowView.getContext()));
    categoryAllApi = arrayList.get(position);
    Ion.with(holder.im_pic).load(categoryAllApi.getImage());
    holder.tv_title.setText(categoryAllApi.getTitle());
    holder.tv_price.setText("Rs. " + categoryAllApi.getPrice());
    holder.tv_mrp.setText("Rs. " + categoryAllApi.getMrp());
    holder.tv_discount.setText("" + categoryAllApi.getDiscount() + "%");
    rowView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(context, ProductDetails.class);
            Bundle bundle = new Bundle();
            bundle.putString("operation", "");
            bundle.putString("productkey", "");
            intent.putExtras(bundle);
            context.startActivity(intent);
        }
    });
    return rowView;
}
}

这里是CategoryApiCall.java:

public class CategoryAllApi {
private String title, image;
private int price, mrp, discount;
public String getTitle() {
    return title;
}
public void setTitle(String title) {
    this.title = title;
}
public String getImage() {
    return image;
}
public void setImage(String image) {
    this.image = image;
}
public int getPrice() {
    return price;
}
public void setPrice(int price) {
    this.price = price;
}
public int getMrp() {
    return mrp;
}
public void setMrp(int mrp) {
    this.mrp = mrp;
}
public int getDiscount() {
    return discount;
}
public void setDiscount(int discount) {
    this.discount = discount;
}
}

我看到你使用了GridView。

RecyclerView是由Google引入的,它克服了listview和Gridview的缺点,这些缺点使ram充满了垃圾,使应用程序变得笨拙。

使用RecyclerView与GridLayoutManager。此外,在RecyclerView中研究无限滚动(这很容易实现)。

我强烈推荐你的应用程序,因为我已经尝试过同样的结果是出色的。应用程序速度更快,内存变得更轻,滚动也很棒。此外,还将提供许多类似recyclerView对象的特性。谷歌是时候解决这些问题,提高应用质量了。

过程可能看起来像一个任务,但从长远来看,它会帮助你和应用程序的用户很多。

最新更新