2012-01-26 50 views
0

我在搜索ListView時遇到問題。在我的活動中,我在列表中顯示了一些數據,現在我在該列表的頂部有一個搜索欄。我想實現這一點,當我在搜索欄中輸入時,listview中的數據應根據搜索結果進行調整。我已經使用了TextWatcher,但問題在於我在其中填充列表視圖中的數據的ArrayList是自定義類型。如何在android中動態搜索TextView上顯示的數據?

這是自定義類型。

public class FRNews { 

// Private Members START 
     private long id = 0; 
     private String headline = ""; 
     private String detail = ""; 
     private String submit_date = Configuration.DEFAULT_DATE; 

//Private Members END 


// Getter/Setter START 
     public void setId(long id){ 
      this.id = id ; 
     } 

     public void setHeadline(String headline){ 
      this.headline = headline ; 
     } 

     public void setDetail(String detail){ 
      this.detail = detail; 
     } 

     public void setSubmitDate(String submit_date){ 
      this.submit_date = submit_date; 
     } 

     public long getId(){ 
      return this.id ; 
     } 

     public String getHeadline(){ 
      return this.headline ; 
     } 

     public String getDetail(){ 
      return this.detail; 
     } 

     public String getSubmitDate(){ 
      return this.submit_date; 
     } 

// Getter/Setter END   

} 

這是我的類,它調用陣列適配器並使用TextWatcher搜索列表視圖。

public class FRNewsList extends ListActivity { 
    public static ArrayList<FRNews> newsList = new ArrayList<FRNews>(); 
    public static ArrayList<FRNews> tempList = new ArrayList<FRNews>(); 

    private int detailId = 0; 
    private ProgressDialog progDialog; 
    private FRCustomAdapterLatestNews newsAdapter; 

    private ListView listView; 
    private EditText etSearch; 

    private TextView tvSeeAllNews; 

    private String headline; 

    int textLength = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.tab_home_main); 

     listView = (ListView) findViewById(android.R.id.list); 
     etSearch = (EditText) findViewById(R.id.et_search_news); 

     tvSeeAllNews = (TextView) findViewById(R.id.tv_news_see_all); 

     if (newsList == null) { 
      newsList = new ArrayList<FRNews>(); 
     } 
     if (tempList == null) { 
      tempList = new ArrayList<FRNews>(); 
     } 

     putNewsInView(); 

     // listView.setAdapter(new ArrayAdapter<FRNews>(this, 
     // android.R.layout.simple_list_item_1, tempList)); 

     listView.setOnItemClickListener(new OnItemClickListener() { 

      public void onItemClick(AdapterView<?> arg0, View view, 
        int position, long id) { 
       setDetailId(position); 

       int newsId = getDetailId(); 

       Intent i = new Intent(FRNewsList.this, 
         FRLatestNewsDetailActivity.class); 
       i.putExtra("id", newsId); 

       // Create the view using FirstGroup's LocalActivityManager 
       View v = FRNewsDetailActivityGroup.group 
         .getLocalActivityManager() 
         .startActivity("news_detail", 
           i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) 
         .getDecorView(); 

       // Again, replace the view 
       FRNewsDetailActivityGroup.group.replaceView(v); 

      } 
     }); 

     etSearch.addTextChangedListener(new TextWatcher() { 

      public void onTextChanged(CharSequence s, int start, int before, 
        int count) { 

       getNewsDbContent(); 
       textLength = count; 
       tempList.clear(); 
       // int a = newsList.size(); 
       if (s.length() > 0) { 
        for (int i = 0; i < newsList.size(); i++) { 
         FRNews searchNews = newsList.get(i); 
         String headlineSearch = searchNews.getHeadline(); 
         if (textLength <= headlineSearch.length()) { 
          if (etSearch 
            .getText() 
            .toString() 
            .equalsIgnoreCase(
              (String) headlineSearch 
                .subSequence(0, textLength))) { 
           tempList.add(i, searchNews); 
          } 
         } 
        } 
        listView.setAdapter(new ArrayAdapter<FRNews>(
          FRNewsList.this, 
          android.R.layout.simple_list_item_1, tempList)); 
       } else 
        listView.setAdapter(new ArrayAdapter<FRNews>(
          FRNewsList.this, 
          android.R.layout.simple_list_item_1, newsList)); 
      } 

      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) { 
      } 

      public void afterTextChanged(Editable s) { 
      } 
     }); 

     tvSeeAllNews.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       Intent i = new Intent(FRNewsList.this, FRAllNews.class); 

       // Create the view using FirstGroup's LocalActivityManager 
       View view = FRNewsDetailActivityGroup.group 
         .getLocalActivityManager() 
         .startActivity("news_all", 
           i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) 
         .getDecorView(); 

       // Again, replace the view 
       FRNewsDetailActivityGroup.group.replaceView(view); 
      } 
     }); 
    } 

    private void putNewsInView() { 
     // public void run() { 
     getNewsDbContent(); 
     newsAdapter = new FRCustomAdapterLatestNews(getApplicationContext(), 
       R.layout.tab_home_row, R.id.tv_news_date, tempList); 

     setListAdapter(newsAdapter); 
    } 

    private void getNewsDbContent() { 
     newsList.clear(); 
     tempList.clear(); 
     FRNewsTable getNews = new FRNewsTable(FRNewsList.this); 
     newsList = getNews.getNewsFromDB("news_id,headline,detail,submit_date"); 
     // setNewsList(newsList); 
     tempList = newsList; 
     getNews.CloseDB(); 

    } 

    public int getDetailId() { 
     return detailId; 
    } 

    public void setDetailId(int detailId) { 
     this.detailId = detailId; 
    } 

} 

我沒有得到我的ArrayList的大小,因爲我在調試時使用newsList.size()。 請查看此代碼並在此幫助我。

在此先感謝。

+0

請你回答我的問題你的代碼,如果你的列表視圖擁有所有國家名稱,用戶鍵入字母** A **然後,列表視圖能夠顯示與首字母的所有國家** A **或** a **。是或否 ?? –

+0

是的,這是我想要做的,但我的ArrayList包含對象,而不是字符串。 – aiRbornE

+0

我認爲你的程序可能會給出正確的結果,但它不是更好的方法來滿足你的要求。請檢查我的答案,它可能暫時有用。 –

回答

0

試着寫內部TextChangedListener

0

對於此要求,您可以使用AutoCompleteTextView。爲什麼你使用ListView?

AutoCompleteTextView僅用於此目的。只需檢查下面鏈接中的代碼,您就會了解如何使用AutoCompleteTextView。

Example of AutoCompleteTextView

即使逛鏈接後,你是不是能夠理解,隨時問我。

相關問題