[英]I have a listview which contains more that 1 value in a row, how can i filter the list with a name value when i type in Edittext?
如果連續只有一個值。 我得到了答案,但我不止一個。
這是我的主班,我無法決定如何填寫Textwatcher的內容。 “ CityArray”是我創建行的類,“ CityXmlParse”是我從原始文件夾中的XML文件“ cities.xml”中獲取數據的類。 每行都有一個圖像和一個名稱,我想在鍵入時按名稱過濾行,但鍵入(帶有圖像)后必須看到整行。
公共類TravelFinalActivity擴展Activity {
EditText sc;
ListView lv;
List<CityData> citylist;
CityArray adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sc = (EditText) findViewById(R.id.citySearch);
CityXmlParse cityParse = new CityXmlParse();
InputStream in = getResources().openRawResource(R.raw.cities);
cityParse.xmlParse(in);
citylist = cityParse.getList();
adapter = new CityArray(getApplicationContext(),R.layout.city_row, citylist);
lv = (ListView) this.findViewById(R.id.cityList);
lv.setAdapter(adapter);
lv.setTextFilterEnabled(true);
sc.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
}}
這是xml解析的類。
公共類CityXmlParse {
private final List<CityData> list = new ArrayList<CityData>();
private String getNodeValue(NamedNodeMap map, String key) {
String nodeValue = null;
Node node = map.getNamedItem(key);
if (node != null) {
nodeValue = node.getNodeValue();
}
return nodeValue;
}
public List<CityData> getList(){
return this.list;
}
public void xmlParse(InputStream in){
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(in, null);
NodeList cityList = doc.getElementsByTagName("city");
for(int i=0; i<cityList.getLength(); i++){
final NamedNodeMap cityAttr = cityList.item(i).getAttributes();
final String cityName=getNodeValue(cityAttr, "name");
final String cityInfo=getNodeValue(cityAttr, "info");
CityData cityObj = new CityData(cityName, cityInfo, cityName + ".png");
list.add(cityObj);
}
}catch (Throwable T) {}
}
}
最后,這是我的“ CityArray”構造函數和用於自定義行的方法。
public CityArray(Context context, int textViewResourceId, List<CityData> citylist) {
super(context, textViewResourceId, citylist);
this.citylist=citylist;
this.context=context;
}
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if(rowView == null){
inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
rowView = inflater.inflate(R.layout.city_row, parent,false);
}
CityData cityObj = getItem(position);
cityImage = (ImageView) rowView.findViewById(R.id.city_image);
cityName = (TextView) rowView.findViewById(R.id.city_name);
String imgPath = ASSETS_DIR + cityObj.resourceImg;
try {
Bitmap bitmap = BitmapFactory.decodeStream(this.context.getResources().getAssets().open(imgPath));
cityImage.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
cityName.setText(cityObj.name);
return rowView;
}
提前致謝!
使ArrayAdapter
項目可過濾: ArrayAdapter
具有內置的ArrayFilter
,它通過對每個對象使用toString().toLowerCase()
的字符串來比較適配器列表中的對象。 如果在CityData
類中重寫toString()
並返回城市名稱,則ArrayAdapter
應該能夠有效地過濾項目。
在啟用自動文本過濾器ListView
:在ListView
或者使用android:textFilterEnabled="true"
的布局,或使用設置的代碼setTextFilterEnabled(true)
。 現在,只要listView
成為焦點,用戶都可以簡單地抬起鍵盤並開始輸入,列表項將被自動過濾。
在明確設置文本過濾器ListView
:使用setFilterText()
的方法ListView
。 不要忘記稍后清除此內容。
您可以通過查看相關的Android Sources揭示更多細節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.