Ebay API -滚动加载更多的项目加载相同的数据



我不确定是什么使这种行为的方式,它的行为,但我最近改变了我的搜索方法从findItemsByKeywordsfindItemsAdvanced源。

然后我将这一行添加到我的请求中,与我的正常搜索关键字查询一起。

request.categoryId = category;

由于某种原因,如果我请求一个特定的类别来搜索我的搜索关键字,除了我的正常搜索关键字,它加载绝对良好的第一次初始加载,但当我滚动到底部更多的项目要加载,它只是显示相同的数据已经加载。

如果我只请求其中一个,而不是同时请求两个,则不会发生这种情况。

EDIT:我的理论可能是与我的onScrollStateChanged在班上垫底有关,但我似乎找不到问题。

编辑2:这似乎只发生如果我请求request.categoryId = category;request.keywords = searchKeywords;在一起。我可以请求其他的组合,如request.sortOrder = SortOrderType.END_TIME_SOONEST;等与任何一个2,只是不是他们两个在一起。

这是我的班级,也许有人能指导我,谢谢。

public class CitroenC1 extends ListFragment implements OnScrollListener {
private static final String TAG = CitroenC1.class.getSimpleName();
static final int DEFAULT_ENTRIES_PER_PAGE = 25;
private String nothing = "";
private String category = "9801";
private int lastItem = 0;
private int totalItemCount = 0;
private String searchKeywords;
private ProgressDialog progressDialog;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.activity_main, null);
    String keywords = ((Button) v.findViewById(R.id.C1)).getText()
            .toString();
    searchKeywords = keywords;
    return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    this.getListView().setOnScrollListener(this);

    // make a search
    findItemsAdvanced(1, DEFAULT_ENTRIES_PER_PAGE, true);
}
// asynchronously trigger findItemsByKeywords call
private void findItemsAdvanced(int pageNum, int entriesPerPage,
        final boolean newSearch) {
    progressDialog = ProgressDialog.show(getActivity(), "Please wait...",
            "Retrieving data...", true, true);
    if (newSearch) {
        // reset
        lastItem = 0;
        totalItemCount = 0;
    }
    // build a request object
    FindItemsAdvancedRequest request = new FindItemsAdvancedRequest();
            //Here
    request.keywords = searchKeywords;
    request.categoryId = category;
    PaginationInput pi = new PaginationInput();
    pi.pageNumber = pageNum;
    pi.entriesPerPage = entriesPerPage;
    request.paginationInput = pi;
    // show fixed price and auction item only
    ItemFilter itemFilter = new ItemFilter();
    itemFilter.name = ItemFilterType.LISTING_TYPE;
    itemFilter.value = new ArrayList<String>();
    itemFilter.value.add("FixedPrice");
    itemFilter.value.add("Auction");
    request.itemFilter = new ArrayList<ItemFilter>();
    request.itemFilter.add(itemFilter);
    // Get shared client
    FindingServicePortType_SOAPClient client = FindingServiceClient
            .getSharedClient();
    client.setDebug(true);
    // make API call and register callbacks
    client.findItemsAdvanced(request,
            new SOAPServiceCallback<FindItemsAdvancedResponse>() {
                @Override
                public void onSuccess(
                        FindItemsAdvancedResponse responseObject) {
                    if (progressDialog != null) {
                        progressDialog.dismiss();
                        progressDialog = null;
                    }
                    if (responseObject.ack == AckValue.SUCCESS) { // handle
                                                                    // sucessful
                                                                    // response
                        SearchResult searchResult = responseObject.searchResult;
                        if (newSearch) {
                            List<SearchItem> items = (searchResult.item != null) ? searchResult.item
                                    : new ArrayList<SearchItem>();
                            ItemAdapter itemAdapter = new ItemAdapter(
                                    getActivity(), R.layout.row, items);
                            CitroenC1.this.setListAdapter(itemAdapter);
                        } else {
                            if (searchResult.item != null) {
                                ItemAdapter itemAdapter = (ItemAdapter) CitroenC1.this
                                        .getListAdapter();
                                itemAdapter.items.addAll(searchResult.item);
                                itemAdapter.notifyDataSetChanged();
                            }
                        }
                    } else { // handle response resident error
                        String errorMessage = responseObject.errorMessage.error
                                .get(0).message;
                        ALog.e(TAG, errorMessage);
                        Toast.makeText(getActivity(), errorMessage,
                                Toast.LENGTH_LONG).show();
                    }
                }
                @Override
                public void onFailure(Throwable error, String errorMessage) { // http
                                                                                // or
                                                                                // parsing
                                                                                // error
                    if (progressDialog != null) {
                        progressDialog.dismiss();
                        progressDialog = null;
                    }
                    Toast.makeText(getActivity(), errorMessage,
                            Toast.LENGTH_LONG).show();
                }
                @Override
                public void onSOAPFault(Object soapFault) { // soap fault
                    if (progressDialog != null) {
                        progressDialog.dismiss();
                        progressDialog = null;
                    }
                    com.leansoft.nano.soap12.Fault fault = (com.leansoft.nano.soap12.Fault) soapFault;
                    Reasontext reasonText = fault.reason.text.get(0);
                    ALog.e(TAG, reasonText.value);
                    Toast.makeText(getActivity(), reasonText.value,
                            Toast.LENGTH_LONG).show();
                }
            });
}
private class ItemAdapter extends ArrayAdapter<SearchItem> {
    private List<SearchItem> items;
    public ItemAdapter(Context context, int textViewResourceId,
            List<SearchItem> items) {
        super(context, textViewResourceId, items);
        this.items = items;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) getActivity()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.row, null);
        }
        final SearchItem item = items.get(position);
        if (item != null) {
            TextView title = (TextView) v.findViewById(R.id.title);
            TextView price = (TextView) v.findViewById(R.id.price);
            TextView bidType = (TextView) v.findViewById(R.id.bids);
            TextView timeleft = (TextView) v.findViewById(R.id.timeleft);
            if (title != null) {
                title.setText(item.title);
            }
            Amount convertedCurrentPrice = item.sellingStatus.convertedCurrentPrice;
            price.setText("£"
                    + eBayUtil.formatCurrencyToString(
                            convertedCurrentPrice.value, nothing));
            String listingType = item.listingInfo.listingType;
            if (listingType.equalsIgnoreCase("FixedPrice")
                    || listingType.equalsIgnoreCase("StoreInventory")) {
                bidType.setBackgroundResource(R.drawable.bin_clear);
                bidType.setText("");
            } else {
                bidType.setBackgroundResource(R.drawable.light_blue_pixel);
                bidType.setText(item.sellingStatus.bidCount + " bids");
            }
            Duration duration = item.sellingStatus.timeLeft;
            if (duration.getDays() == 0 && duration.getHours() == 0
                    && duration.getMinutes() < 10) {
                timeleft.setTextColor(Color.RED);
            } else {
                timeleft.setTextColor(Color.BLACK);
            }
            timeleft.setText(eBayUtil.formatDuration(duration));
            WebImageView image = (WebImageView) v
                    .findViewById(R.id.gallery_icon);
            if (image != null) {
                if (item.galleryURL != null) {
                    image.setImageUrl(item.galleryURL);
                    image.loadImage();
                } else {
                    image.setNoImageDrawable(R.drawable.placeholder);
                }
            }
            // once clicked, navigate to item details page
            v.setOnClickListener(new OnItemClickListener(item.itemId, v
                    .getContext()));
        }
        return v;
    }
}
private class OnItemClickListener implements OnClickListener {
    private String mItemId;
    private Context mCxt;
    OnItemClickListener(String itemId, Context cxt) {
        mItemId = itemId;
        mCxt = cxt;
    }
    @Override
    public void onClick(View arg0) {
        ALog.d(TAG, "onItemClick at item " + mItemId);
        Intent intent = new Intent(mCxt, DetailActivity.class);
        intent.putExtra("ITEM_ID", mItemId);
        startActivity(intent);
    }
}
// for dynamic pagination
@Override
public void onScroll(AbsListView view, int firstVisible, int visibleCount,
        int totalCount) {
    lastItem = firstVisible + visibleCount;
    totalItemCount = totalCount;
}
// for dynamic pagination
@Override
public void onScrollStateChanged(AbsListView arg0, int scrollState) {
    if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
        boolean loadMore = lastItem >= totalItemCount;
        if (loadMore) {
            int nextPage = totalItemCount / DEFAULT_ENTRIES_PER_PAGE + 1;
            findItemsAdvanced(nextPage, DEFAULT_ENTRIES_PER_PAGE, false);
        }
    }
}
    }

我希望你的代码在不同的文件中分开,这只是为了演示。

private int lastItem = 0;

int totalItemCount = 0;

您使用这些字段来知道从哪里更新。

你的onScroll更新他们之前被调用,每次用户滚动。

@Override
public void onScroll(AbsListView view, int firstVisible, int visibleCount,
    int totalCount) {
lastItem = firstVisible + visibleCount;
totalItemCount = totalCount;
}

当滚动停止或者换句话说SCROLL_STATE_IDLE这些参数得到更新,所以你只需要把你的更新评估放在OnScroll下或者你把你的请求代码放在OnScrollStateChanged

@Override
public void onScroll(AbsListView view, int firstVisible, int visibleCount,
    int totalCount) {
lastItem = firstVisible + visibleCount;
totalItemCount = totalCount;
boolean loadMore = lastItem >= totalItemCount;
    if (loadMore) {
        int nextPage = totalItemCount / DEFAULT_ENTRIES_PER_PAGE + 1;
        findItemsAdvanced(nextPage, DEFAULT_ENTRIES_PER_PAGE, false);
    }
}

尝试一下,让我知道,如果不工作记录你的参数lastItem在onScrollState和当你请求你的下一页。

问候。

相关内容

最新更新