我不确定是什么使这种行为的方式,它的行为,但我最近改变了我的搜索方法从findItemsByKeywords
到findItemsAdvanced
源。
然后我将这一行添加到我的请求中,与我的正常搜索关键字查询一起。
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和当你请求你的下一页。
问候。