我在搜索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()。 请查看此代码并在此帮助我。
提前致谢。
答案 0 :(得分:0)
您可以使用 AutoCompleteTextView 来满足此要求。你为什么使用ListView?
AutoCompleteTextView仅用于此目的。只需查看以下链接中提供的代码,您就可以了解如何使用AutoCompleteTextView。
Example of AutoCompleteTextView
即使在访问该链接后,您也无法理解,请随时问我。
答案 1 :(得分:0)
尝试在TextChangedListener