2012-01-26 52 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

即使逛链接后,你是不是能够理解,随时问我。

相关问题