2012-09-27 46 views
0

我遇到問題。我的一些字符串條目有括號[ie。鮑伯(羅伯特)]。如果我會搜索「羅伯特」,它不會被發現。有什麼我可以做,添加或更改,以便它可以在括號,括號內,破折號後找到單詞等。ListView搜索不識別符號後的單詞

我的代碼如下。這來自androidhive教程http://www.androidhive.info/2012/09/android-adding-search-functionality-to-listview/。我爲我的目的修改了代碼,但是我顯示了androidhive代碼。如何讓搜索在括號或其他符號中看到單詞?

package com.androidhive.androidlistviewwithsearch; 


import java.util.ArrayList; 
import java.util.HashMap; 

import android.app.Activity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.ListView; 

public class MainActivity extends Activity { 

    // List view 
    private ListView lv; 

    // Listview Adapter 
    ArrayAdapter<String> adapter; 

    // Search EditText 
    EditText inputSearch; 

    // ArrayList for Listview 
    ArrayList<HashMap<String, String>> productList; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Listview Data 
     String products[] = {"Dell Inspiron", "HTC One X", "HTC Wildfire S", "HTC Sense", "HTC Sensation XE", 
           "iPhone 4S", "Samsung Galaxy Note 800", 
           "Samsung Galaxy S3", "MacBook Air", "Mac Mini", "MacBook Pro"}; 

     lv = (ListView) findViewById(R.id.list_view); 
     inputSearch = (EditText) findViewById(R.id.inputSearch); 

     // Adding items to listview 
     adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.product_name, products); 
     lv.setAdapter(adapter); 

     /** 
     * Enabling Search Filter 
     * */ 
     inputSearch.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
       // When user changed the Text 
       MainActivity.this.adapter.getFilter().filter(cs); 
      } 

      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
        int arg3) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void afterTextChanged(Editable arg0) { 
       // TODO Auto-generated method stub 
      } 
     }); 
    } 
} 
+0

您沒有發佈代碼中最重要的位:過濾完成! – dmon

+0

這是主要的代碼。所有這一切,除了我的問題,它的工作很棒。有一個xml文件用於列表視圖的外觀和佈局。還有另一個xml文件,它由一個editbox和listview標籤組成。按照鏈接查看所有內容的外觀,但我發佈的是搜索的所有編碼。 – djmedic

+0

很好的教程在這裏http://tech-papers.org/android-listview-search-using-filter/ –

回答

0

我明白了。問題是提供的默認篩選器是ArrayFilter(您可以看到代碼here)。這個類假設你想要一個前綴搜索,所以你永遠不會匹配文本開始後的任何東西; 「ob」不符合「Bob」。獲得所需行爲的唯一方法是擴展您的ArrayAdapter以提供您自己的getFilter()方法實現,並返回與您想要的文本相匹配的新自定義過濾器。

+0

其實「ob」會拿出「bob」,這不是問題。問題是如果列表項是「鮑勃(羅伯特)」,我輸入「r」或「羅布」或甚至「羅伯特」,它不會顯示條目「鮑勃(羅伯特)」。如果我輸入一個部分條目甚至是一個條目的最後一個字母(前「ob」),它會找到該條目,但是如果我在括號中放入了某個部分條目,那麼它將找不到它。 – djmedic

+0

對,你看我鏈接的代碼嗎?唯一的比較是'string.startsWith()'(在字符串被空格分隔後,對整個文本和每個標記)進行比較。正如我所說的,如果你想做一個「包含」類型的搜索,你必須實現你自己的過濾邏輯。 – dmon