如何在android中动态搜索TextView上显示的数据?

时间:2012-01-26 07:15:33

标签: android listview search

我在搜索ListView时遇到问题。在我的活动中,我在列表中显示了一些数据,现在我在该列表的顶部有一个搜索栏。我想实现当我在搜索栏中输入时,listview中的数据应该根据搜索结果进行调整。我使用过TextWatcher,但问题是我在列表视图中填充数据的ArrayList是自定义类型。

这是自定义类型。

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()。 请查看此代码并在此帮助我。

提前致谢。

2 个答案:

答案 0 :(得分:0)

您可以使用 AutoCompleteTextView 来满足此要求。你为什么使用ListView?

AutoCompleteTextView仅用于此目的。只需查看以下链接中提供的代码,您就可以了解如何使用AutoCompleteTextView。

Example of AutoCompleteTextView

即使在访问该链接后,您也无法理解,请随时问我。

答案 1 :(得分:0)

尝试在TextChangedListener

中编写代码