繁体   English   中英

我有一个连续包含超过1个值的列表视图,当我在Edittext中键入内容时,如何用名称值过滤列表?

[英]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应该能够有效地过滤项目。

  • 在启用自动文本过滤器ListViewListView或者使用android:textFilterEnabled="true"的布局,或使用设置的代码setTextFilterEnabled(true) 现在,只要listView成为焦点,用户都可以简单地抬起键盘并开始输入,列表项将被自动过滤。

  • 在明确设置文本过滤器ListView使用setFilterText()的方法ListView 不要忘记稍后清除此内容。

您可以通过查看相关的Android Sources揭示更多细节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM