问题是从autocompletetextview内部的对象列表中捕获了2个值。
好的。让我们看看MapFragment中的一些代码:
private AutocompleteAdapter autocompleteAdapter;
private AppCompatAutoCompleteTextView luogoInput;
private static final int TRIGGER_AUTO_COMPLETE = 100;
private static final long AUTO_COMPLETE_DELAY = 300;
private Handler handlerLuogo;
private static final int REQUEST_CODE = 101;
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
/* find view text used for autocomplete as txtLocalita,see below */
luogoInput = rootView.findViewById(R.id.txtLocalita);
/* set autocomplete adapter */
autocompleteAdapter = new AutocompleteAdapter(getactivity(),android.R.layout.simple_dropdown_item_1line);
luogoInput.setThreshold(3);
luogoInput.setadapter(autocompleteAdapter);
luogoInput.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s,int start,int count,int after) {
}
@Override
public void onTextChanged(CharSequence s,int before,int count) {
handlerLuogo.removeMessages(TRIGGER_AUTO_COMPLETE);
handlerLuogo.sendEmptyMessageDelayed(TRIGGER_AUTO_COMPLETE,AUTO_COMPLETE_DELAY);
}
@Override
public void afterTextChanged(Editable s) {
}
});
luogoInput.setOnItemClicklistener(new AdapterView.OnItemClicklistener() {
/* Method of autocomplete click */
@Override
public void onItemClick(AdapterView<?> arg0,View arg1,int arg2,long arg3) {
SearchMappa selected = (SearchMappa) arg0.getadapter().getItem(arg2);
Toast.makeText(getactivity(),"Clicked " + arg2 + " città: " + selected.getcitta() + " latitudine: " + selected.getLatitudine() + " longitudine: " + selected.getLongitudine(),Toast.LENGTH_SHORT).show();
}
});
handlerLuogo = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if (msg.what == TRIGGER_AUTO_COMPLETE) {
if (!TextUtils.isEmpty(luogoInput.getText())) {
makeApiCall2(luogoInput.getText().toString());
}
}
return false;
}
});
}
来自用php开发的api的对象列表类(makeapicall2是用于获取对象列表的“ Web服务”):
public class SearchMappa implements Parcelable {
public String citta;
public String latitudine;
public String longitudine;
private SearchMappa searchMappaItem;
private SharedPrefsHelper sharedPrefsHelper;
public SearchMappa() {
}
public SearchMappa(String citta,String latitudine,String longitudine) {
this.citta = citta;
this.latitudine = latitudine;
this.longitudine = longitudine;
}
protected SearchMappa(Parcel in) {
citta = in.readString();
latitudine = in.readString();
longitudine = in.readString();
searchMappaItem = in.readParcelable(SearchMappa.class.getclassLoader());
}
@Override
public void writeToParcel(Parcel dest,int flags) {
dest.writeString(citta);
dest.writeString(latitudine);
dest.writeString(longitudine);
dest.writeParcelable(searchMappaItem,flags);
}
public SearchMappa(Context context,JSONObject jsonObject){
sharedPrefsHelper = new SharedPrefsHelper(context);
searchMappaItem = new SearchMappa();
try
{
if (jsonObject.getString("citta") != null) {
}
}
catch(Exception e)
{
Log.e("Eccezione parsing json",e.toString());
}
sharedPrefsHelper = new SharedPrefsHelper(context);
try {
searchMappaItem = parseSearchMappa(context,searchMappaItem,jsonObject);
} catch (Exception e) {
Log.e("Exception parseJson",e.toString());
}
}
public SearchMappa parseSearchMappa(Context context,SearchMappa searchMappaItem,JSONObject jsonObject) {
sharedPrefsHelper = new SharedPrefsHelper(context);
try {
searchMappaItem.setCitta(jsonObject.getString("citta"));
searchMappaItem.setLatitudine(jsonObject.getString("latitudine"));
searchMappaItem.setLongitudine(jsonObject.getString("longitudine"));
} catch (Exception e) {
Log.e("Exception parseJson",e.toString());
} finally {
return searchMappaItem;
}
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<SearchMappa> CREATOR = new Creator<SearchMappa>() {
@Override
public SearchMappa createFromParcel(Parcel in) {
return new SearchMappa(in);
}
@Override
public SearchMappa[] newArray(int size) {
return new SearchMappa[size];
}
};
public String getcitta() {
return citta;
}
public void setCitta(String citta) {
this.citta = citta;
}
public String getLatitudine() {
return latitudine;
}
public void setLatitudine(String latitudine) {
this.latitudine = latitudine;
}
public String getLongitudine() {
return longitudine;
}
public void setLongitudine(String longitudine) {
this.longitudine = longitudine;
}
}
用于AutoCompleteTextView的自动完成适配器,名为“ txtLocalita”
public class AutocompleteAdapter extends ArrayAdapter<SearchMappa> implements Filterable {
private List<SearchMappa> mlistData;
public AutocompleteAdapter(@NonNull Context context,int resource) {
super(context,resource);
mlistData = new ArrayList<>();
}
public void setData(List<SearchMappa> list) {
mlistData.clear();
mlistData.addAll(list);
}
@Override
public int getcount() {
return mlistData.size();
}
@Nullable
@Override
public SearchMappa getItem(int position) {
return mlistData.get(position);
}
/**
* Used to Return the full object directly from adapter.
*
* @param position
* @return
*/
public SearchMappa getObject(int position) {
return mlistData.get(position);
}
@NonNull
@Override
public Filter getFilter() {
Filter dataFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
if (constraint != null) {
filterResults.values = mlistData;
filterResults.count = mlistData.size();
}
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint,FilterResults results) {
if (results != null && (results.count > 0)) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
};
return dataFilter;
}
}
最后,Autocompletetextview的xml中名为txtLocalita的组件具有以下当前代码:
<AutoCompleteTextView
android:id="@+id/txtLocalita"
android:layout_width="0dp"
android:layout_height="match_parent"
android:drawableLeft="@drawable/ic_username"
android:hint="Cerca luogo"
android:height="40dp"
android:text=""
android:layout_centerHorizontal="true"
android:textSize="15sp"
android:layout_weight="3.5"
android:paddingLeft="10dp"
android:textColor="@color/oro"
android:textColorHint="@color/oro"
android:drawablePadding="10dp"
android:layout_margin="10dp"
android:background="@drawable/input_login"
/>
我想要的结果是:当我写前3个字母(有效)时,自动完成功能必须仅显示SearchMappa值类的“ citta”,但它显示整个对象。因此: 自动完成工作
但是我只想查看“ citta”值,当我单击其中的一个时,我必须选择所选项目的“ latitudine”和“ longitudine”值。我该怎么做? 任何帮助表示赞赏。 谢谢 克里斯蒂安