我在搜索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()。 請查看此代碼並在此幫助我。
在此先感謝。
請你回答我的問題你的代碼,如果你的列表視圖擁有所有國家名稱,用戶鍵入字母** A **然後,列表視圖能夠顯示與首字母的所有國家** A **或** a **。是或否 ?? –
是的,這是我想要做的,但我的ArrayList包含對象,而不是字符串。 – aiRbornE
我認爲你的程序可能會給出正確的結果,但它不是更好的方法來滿足你的要求。請檢查我的答案,它可能暫時有用。 –