Java 我有一个listview,它在一行中包含超过1个值,当我键入Edittext时,如何使用名称值筛选列表?

Java 我有一个listview,它在一行中包含超过1个值,当我键入Edittext时,如何使用名称值筛选列表?,java,android,android-edittext,row,Java,Android,Android Edittext,Row,如果一行中只有一个值。我得到了答案,但我不止一个 这是我的主要课程,我无法决定如何填充Textwatcher的内容。“CityArray”是我创建行的类,“CityXmlParse”是我从原始文件夹中名为“cities.XML”的XML文件中获取数据的类。每一行都有一个图像和一个名称,我想在键入时按名称过滤这些行,但键入后必须看到整行(带图像) 公共类TravelFinalActivity扩展了活动{ EditText sc; ListView lv; List<CityData>

如果一行中只有一个值。我得到了答案,但我不止一个

这是我的主要课程,我无法决定如何填充Textwatcher的内容。“CityArray”是我创建行的类,“CityXmlParse”是我从原始文件夹中名为“cities.XML”的XML文件中获取数据的类。每一行都有一个图像和一个名称,我想在键入时按名称过滤这些行,但键入后必须看到整行(带图像)

公共类TravelFinalActivity扩展了活动{

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
       }
  });   
edittextsc;
ListView lv;
列出城市名单;
城市射线适配器;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sc=(EditText)findViewById(R.id.citySearch);
CityXmlParse cityParse=新的CityXmlParse();
InputStream in=getResources().openRawResource(R.raw.cities);
xmlParse(in);
citylist=cityParse.getList();
adapter=new CityArray(getApplicationContext(),R.layout.city_行,citylist);
lv=(ListView)this.findViewById(R.id.cityList);
低压设置适配器(适配器);
lv.setTextFilterEnabled(真);
sc.addTextChangedListener(新的TextWatcher(){
public void onTextChanged(字符序列、int start、int before、int count){
//TODO自动生成的方法存根
}
更改前的公共无效(字符序列、整数开始、整数计数、,
整数后){
//TODO自动生成的方法存根
}
公共无效后文本已更改(可编辑){
//TODO自动生成的方法存根
}
});   
} }

下面是用于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) {}

}
private final List=new ArrayList();
私有字符串getNodeValue(NamedNodeMap映射,字符串键){
字符串nodeValue=null;
Node=map.getNamedItem(键);
如果(节点!=null){
nodeValue=node.getNodeValue();
}
返回nodeValue;
}
公共列表getList(){
返回此.list;
}
公共void xmlParse(InputStream-in){
试一试{
DocumentBuilder=DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc=builder.parse(in,空);
NodeList cityList=doc.getElementsByTagName(“城市”);
对于(int i=0;i
  • 使
    阵列适配器中的项可过滤:
    阵列适配器
    具有 内置的
    ArrayFilter
    ,它通过 为每个对象使用
    toString().toLowerCase()
    中的字符串。如果 在
    CityData
    类中重写
    toString()
    ,并返回城市名称, 然后,
    ArrayAdapter
    应该能够有效地过滤项目

  • 列表视图上启用自动文本过滤器
    列表视图中
    在布局中使用
    android:textFilterEnabled=“true”
    ,或使用
    setTextFilterEnabled(true)从代码中设置
    。现在,无论何时
    listView
    处于焦点,用户只需打开键盘,开始键入,列表项就会自动过滤

  • 列表视图
    上显式设置文本过滤器:
    使用
    列表视图
    setFilterText()
    方法。以后不要忘记清除此项


您可以通过查看相关信息来了解更多细节。

您应该观看Android的讲座,了解一些非常好的技巧!谢谢!它们是很棒的教程。
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;
}