当我单击该项目时,填充AutoComplete下拉列表的ArrayAdapter在横向上为大于5的位置返回“-1”。当我的应用程序以纵向运行时,我在单击和项目时返回正确的索引。下面是2个屏幕截图,显示了适配器如何填充每个方向的数据:
编辑:有没有办法强制使用我的下拉列表而不是手机的景观?
不确定这可能是罪魁祸首?
答案 0 :(得分:0)
一种解决方法,并不理想,因为如果小屏幕手机与三星Galaxy S III相同(返回超过阵列第6位的-1的索引),那么崩溃仍将发生,我在我的代码如下。
if (!((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL)) {
mQuery.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
} else {
mQuery.setImeOptions(EditorInfo.IME_ACTION_SEARCH);
}
HTC Wildfire与三星的下拉量相同,但返回的位置超过了指数5.
我将继续调查为什么S III不起作用,但我猜测它是在操作系统级别。
答案 1 :(得分:0)
这是一个非常老的问题,但我遇到了同样的问题(我在三星Galaxy S5上注意到了此错误)。我在performFiltering
ArrayAdapter
方法中添加了以下代码
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
ArrayList<PlaceAutocomplete> queryResults;
if (constraint != null && constraint.length() > 0) queryResults = getPredictions(constraint);
else queryResults = new ArrayList<>(); // empty list/no suggestions
//HERE'S THE IMPORTANT STUFF
int orientation = context.getResources().getConfiguration().orientation;
if ((queryResults !=null) && (queryResults.size() >4) && (orientation ==Configuration.ORIENTATION_LANDSCAPE)) {
// if user in landscape and more than four suggestions offered by Google Places
PlaceAutocomplete item1 = queryResults.get(0);
PlaceAutocomplete item2 = queryResults.get(1);
PlaceAutocomplete item3 = queryResults.get(2);
PlaceAutocomplete item4 = queryResults.get(3);
// empty the suggestion list
queryResults.clear();
// add the only first four suggestion
queryResults.add(item1);
queryResults.add(item2);
queryResults.add(item3);
queryResults.add(item4);
}
filterResults.values = queryResults;
if (queryResults !=null) filterResults.count = queryResults.size();
return filterResults;
}
然后为了安全起见,我在
周围添加了try / catchprivate final AdapterView.OnItemClickListener mAutocompleteClickListener =new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
try {
final PlaceArrayAdapter.PlaceAutocomplete item = placeArrayAdapter.getItem(position);
final String placeId = String.valueOf(item != null ? item.placeId : null);
final String placeDesc = String.valueOf(item != null ? item.description : null);
PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi.getPlaceById(googleApiClient, placeId);
placeResult.setResultCallback(mUpdatePlaceDetailsCallback);
} catch (Exception | Error exception) {
//handle the exception (bug)
}
}
};
我测试了try / catch和adaper更改。两者都可以。