У меня проблема с поиском 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 () во время отладки.
Пожалуйста, просмотрите этот код и помогите мне в этом.
Заранее спасибо.