前提:我是Java和Android的新手,我已经搜索了很多,但我不明白我的代码中是如何实现getFilter的。
这是MainActivity(相关代码):
public void loadList() {
/* allProd and allSpec are ArrayList<String> */
String[] allProdString = allProd.toArray(new String[allProd.size()]);
String[] allSpecString = allSpec.toArray(new String[allSpec.size()]);
listViewAdapter = new ListViewAdapter(this, allProdString, allSpecString);
listView.setAdapter(listViewAdapter);
}
这是customAdapter:
public class ListViewAdapter extends BaseAdapter {
Activity context;
String title[];
String description[];
public ListViewAdapter(Activity context, String[] title, String[] description) {
super();
this.context = context;
this.title = title;
this.description = description;
}
public int getCount() {
return title.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
private class ViewHolder {
TextView txtViewTitle;
TextView txtViewDescription;
}
public View getView(int position, View convertView, ViewGroup parent) {
Typeface typeface = Typeface.createFromAsset(context.getAssets(), "font/Simple_Print.ttf");
ViewHolder holder;
LayoutInflater inflater = context.getLayoutInflater();
if (convertView == null) {
convertView = inflater.inflate(R.layout.tabella_prodotti, null);
holder = new ViewHolder();
holder.txtViewTitle = (TextView) convertView.findViewById(R.id.titoloProd);
holder.txtViewDescription = (TextView) convertView.findViewById(R.id.subtitoloProd);
holder.txtViewDescription.setTypeface(typeface);
holder.txtViewTitle.setTypeface(typeface);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
holder.txtViewTitle.setText(title [position]);
holder.txtViewDescription.setText(description [position]);
return convertView;
}
}
如何实现此功能以便能够在数组中进行搜索,并在列表视图中显示已过滤的结果?
如果您需要任何其他信息,请询问!感谢
答案 0 :(得分:1)
我认为你的适配器应该是这样的。另外,我不建议在getView()中实例化对象,即字体对象
public class ListViewAdapter extends BaseAdapter {
String title[];
String description[];
ArrayList<String> filteredTitleList;
ArrayList<String> filteredDescripionList;
Typeface typeface;
LayoutInflater inflater;
public ListViewAdapter(Activity context, String[] title, String[] description) {
super();
this.context = context;
this.title = title;
this.description = description;
typeface = Typeface.createFromAsset(context.getAssets(),"font/Simple_Print.ttf");
inflater = context.getLayoutInflater();
this.filteredTitleList = new ArrayList<String>();
this.filteredDescripionList = new ArrayList<String>();
applyFilter(null);
}
public void applyFilter(String filter){
filteredTitleList.clear();
filteredDescripionList.clear();
for(int i=0; i < this.title.length; i++){
String tempTitle = title[i];
String tempDesc = description[i];
if(filter == null || filter.equals("")){
this.filteredTitleList.add(tempTitle);
this.filteredDescripionList.add(tempDesc);
}
else if(tempTitle.toLowerCase().contains(filter.toLowerCase()) || tempDesc.toLowerCase().contains(filter.toLowerCase())){
this.filteredTitleList.add(tempTitle);
this.filteredDescripionList.add(tempDesc);
}
}
this.notifyDataSetChanged();
}
public int getCount() {
return filteredTitleList.size();
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return position;
}
private class ViewHolder {
TextView txtViewTitle;
TextView txtViewDescription;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.tabella_prodotti, null);
holder = new ViewHolder();
holder.txtViewTitle = (TextView) convertView.findViewById(R.id.titoloProd);
holder.txtViewDescription = (TextView) convertView.findViewById(R.id.subtitoloProd);
holder.txtViewDescription.setTypeface(typeface);
holder.txtViewTitle.setTypeface(typeface);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
holder.txtViewTitle.setText(this.filteredTitleList.get(position));
holder.txtViewDescription.setText(this.filteredDescriptionList.get(position));
return convertView;
}
}
答案 1 :(得分:0)
我找到了解决方案并与您分享,我将addTextChangedListener添加到MainActivity中的inputSearch:
inputSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
textLength = inputSearch.getText().length();
//allProd_sort and allSpec_sort are ArrayList for search
allProd_sort.clear();
allSpec_sort.clear();
String text = inputSearch.getText().toString();
//allProdString is the String get from ArrayList allProd
for (int y =0; y<allProdString.length; y++) {
//in my case the search works only if there are min 3 characters in search
if (textLength <= allProdString[y].length() && textLength >=3) {
if (Pattern.compile(Pattern.quote(text), Pattern.CASE_INSENSITIVE)
.matcher(allProdString[y]).find()) {
allProd_sort.add(allProdString[y]);
allSpec_sort.add(allSpecString[y]);
}
}
}
String[] allProdStringSort = allProd_sort.toArray(new String[allProd_sort.size()]);
String[] allSpecStringSort = allSpec_sort.toArray(new String[allSpec_sort.size()]);
listView.setAdapter(new ListViewAdapter(MainActivity.this, allProdStringSort, allSpecStringSort));
}
@Override
public void afterTextChanged(Editable editable) {
}
});