自制圖片肇慶網(wǎng)站快速排名優(yōu)化
效果圖
背景
本人因為一些需求初次接觸android,需要實現(xiàn)一個類似android自帶的AutoCompleteTextView(自動完成文本框),但和其不同的是通過后端接口直接篩選數(shù)據(jù)(自己的分詞處理規(guī)則),然后返回前端直接顯示即可。
思路
?這個listview“提示框”在輸入框獲得焦點的情況下才顯示,并且每次輸入框內(nèi)內(nèi)容變化時,觸發(fā)網(wǎng)絡(luò)請求更新“提示框”顯示的內(nèi)容,在用戶點擊了“提示框”中的item后,將item的內(nèi)容替換輸入框當(dāng)前內(nèi)容,并關(guān)閉提示框。
實現(xiàn)
第一步、配置布局文件
利用?RelativeLayout布局,讓edittext和listview重疊顯示,然后利用
android:layout_below="@+id/et_skin"
讓listview定位在edittext輸入框的底部,并通過
android:visibility="gone"
默認(rèn)提示框先不顯示,然后在父布局中使用
android:focusable="true"
android:focusableInTouchMode="true"
讓輸入框不會自動觸發(fā)焦點,最后只需要等到輸入框觸發(fā)焦點時再顯示提示框即可(這里會存在一個弊端,他這個listview布局與其他組件布局不會重疊顯示,是直接順序顯示,如果有大佬知道如何優(yōu)化,可以留下你的方法)。效果圖及代碼如下:
<RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:focusable="true"android:focusableInTouchMode="true"android:layout_marginBottom="20dp"><EditTextandroid:id="@+id/et_skin"android:layout_width="match_parent"android:layout_height="wrap_content"android:inputType="text"android:lines="1"android:background="@drawable/edittext_back"android:padding="7dp"android:textColorHint="@color/notice_item_time"android:hint="皮膚名"/><ListViewandroid:id="@+id/lv_order_skin"android:layout_width="match_parent"android:layout_height="190dp"android:visibility="gone"android:background="@drawable/order_input_listview_bg"android:layout_below="@+id/et_skin" /></RelativeLayout>
?第二步、綁定布局、適配器-實現(xiàn)功能
這里通過分別監(jiān)聽:輸入框焦點獲取和失去、輸入框內(nèi)容變化、提示框item點擊事件來實現(xiàn)我們的需求,具體代碼及備注如下:
private List<String> auto_list_skin = new ArrayList<>(); // 輸入框自動提示內(nèi)容集合private ArrayAdapter<String> adapter_skin; // 適配器private EditText et_skin; // 輸入框private ListView lv_order_skin; // listview提示框@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_order);// 綁定組件et_skin = view_default.findViewById(R.id.et_skin);lv_order_skin = view_default.findViewById(R.id.lv_order_skin);// listview提示框-皮膚名-綁定數(shù)據(jù)集合adapter_skin = new ArrayAdapter<>(OrderActivity.this,android.R.layout.simple_list_item_1, auto_list_skin);// 組件綁定適配器lv_order_skin.setAdapter(adapter_skin);// 監(jiān)聽iten點擊事件lv_order_skin.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {et_skin.setText(auto_list_skin.get(i)); // 選中item-更新數(shù)據(jù)到輸入框中et_skin.setSelection(auto_list_skin.get(i).length()); // 讓輸入框內(nèi)的光標(biāo)定位到最后一位lv_order_skin.setVisibility(View.GONE); // 隱藏提示欄}});// 輸入框-皮膚-焦點監(jiān)聽事件et_skin.setOnFocusChangeListener(new View.OnFocusChangeListener() {@Overridepublic void onFocusChange(View view, boolean hasFocus) {if (hasFocus) {} else {lv_order_skin.setVisibility(View.GONE); // 隱藏提示欄}}});// 輸入框-皮膚-輸入變化事件et_skin.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}@Overridepublic void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {searchInfo(et_skin.getText().toString(), adapter_skin); // 執(zhí)行網(wǎng)絡(luò)請求-更新提示框內(nèi)容lv_order_skin.setVisibility(View.VISIBLE); // 顯示提示欄}@Overridepublic void afterTextChanged(Editable editable) {}});}
最后在網(wǎng)路請求結(jié)果中,通過如下代碼更新數(shù)據(jù)到提示框中,這樣完整的功能就實現(xiàn)了!
auto_list_skin.clear(); // 清空數(shù)據(jù)數(shù)組
auto_list_skin.add("新數(shù)據(jù)item"); // 添加數(shù)據(jù)到數(shù)組中
adapter_skin.notifyDataSetChanged(); // 更新數(shù)組到listtview提示框中