[英]How to implement Search in a Custom ListView in android?
我的應用程序中有一個edittext和一個listview,我的listview顯示聯系人列表。 我想要帶有edittext的listview過濾器。 我在Google上搜索了很多東西,發現有一些例子,但沒有一個對我有用,這是我的自定義適配器代碼
public class MainActivity extends AppCompatActivity {
private static final int CODE_GET_REQUEST = 1024;
private static final int CODE_POST_REQUEST = 1025;
EditText editTextHeroId, editTextName, editTextRealname, editTextComment;
Spinner spinnerTeam;
ProgressBar progressBar;
ListView listView;
Button buttonAddUpdate;
Button buttonScan;
SearchView searchView;
Adapter HeroAdapter;
private List<Hero> heroList = new ArrayList<Hero>();
boolean isUpdating = false;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editTextHeroId = (EditText) findViewById(R.id.editTextHeroId);
editTextName = (EditText) findViewById(R.id.editTextName);
editTextRealname = (EditText) findViewById(R.id.editTextRealname);
editTextComment = (EditText) findViewById(R.id.editTextComment);
spinnerTeam = (Spinner) findViewById(R.id.spinnerTeamAffiliation);
buttonAddUpdate = (Button) findViewById(R.id.buttonAddUpdate);
buttonScan = (Button) findViewById(R.id.buttonScan);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
listView = (ListView) findViewById(R.id.listViewHeroes);
listView.setTextFilterEnabled(true);
heroList = new ArrayList<>();
HeroAdapter adapter = new HeroAdapter(heroList);
final ArrayAdapter<Hero> HeroAdapter = new ArrayAdapter<Hero>(this, R.layout.layout_hero_list, heroList);
listView.setAdapter(adapter);
editTextName.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
HeroAdapter.getFilter().filter(cs);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { }
@Override
public void afterTextChanged(Editable arg0) {}
});
適配器
public class HeroAdapter extends ArrayAdapter<Hero> implements Filterable {
List<Hero> heroList;
public HeroAdapter(List<Hero> heroList) {
super(MainActivity.this, R.layout.layout_hero_list, heroList);
this.heroList = heroList;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = getLayoutInflater();
View listViewItem = inflater.inflate(R.layout.layout_hero_list, null, true);
final TextView textViewName = listViewItem.findViewById(R.id.textViewName);
TextView textViewUpdate = listViewItem.findViewById(R.id.textViewUpdate);
TextView textViewDelete = listViewItem.findViewById(R.id.textViewDelete);
final Hero hero = heroList.get(position);
textViewName.setText(hero.getName());
textViewUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isUpdating = true;
editTextHeroId.setText(String.valueOf(hero.getId()));
editTextName.setText(hero.getName());
editTextRealname.setText(hero.getRealname());
editTextComment.setText(hero.getRating());
spinnerTeam.setSelection(((ArrayAdapter<String>) spinnerTeam.getAdapter()).getPosition(hero.getTeamaffiliation()));
buttonAddUpdate.setText("Update");
}
});
textViewDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Delete " + hero.getName())
.setMessage("Are you sure you want to delete it?")
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
deleteHero(hero.getId());
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
})
.setIcon(android.R.drawable.ic_dialog_alert)
.show();
}
});
return listViewItem;
}
public Filter getFilter() {
Filter filter = new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
heroList = (List<Hero>) results.values;
notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
ArrayList<Hero> heroList = new ArrayList<Hero>();
// perform your search here using the searchConstraint String.
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < heroList.size(); i++) {
Hero dataNames = heroList.get(i);
if (dataNames.toString().toLowerCase().startsWith(constraint.toString())) {
heroList.add(dataNames);
}
}
results.count = heroList.size();
results.values = heroList;
Log.e("VALUES", results.values.toString());
return results;
}
};
return filter;
}
}
當我從edittext填充關鍵字時,列表數據無法顯示。 任何幫助都會得到幫助。 提前致謝
heroList.size()始終為0,因此根本不會進入“ for(int i = 0; i <heroList.size(); i ++)”
您必須刪除“ ArrayList heroList = new ArrayList();” 選擇GLOBAL heroList。
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
**ArrayList<Hero> heroList = new ArrayList<Hero>();**
// perform your search here using the searchConstraint String.
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < heroList.size(); i++) {
Hero dataNames = heroList.get(i);
if (dataNames.toString().toLowerCase().startsWith(constraint.toString())) {
heroList.add(dataNames);
}
}
results.count = heroList.size();
results.values = heroList;
Log.e("VALUES", results.values.toString());
return results;
}
首先,在活動頂部
Adapter HeroAdapter;
應該
HeroAdapter adapter;
然后,你需要真正初始化的,而不是一個不同的適配器,甚至兩個人
this.heroList = new ArrayList<>();
this.adapter = new HeroAdapter(this, heroList);
listView.setAdapter(adapter);
修復適配器的構造函數后,它可以接受上下文,而不是耦合到MainActivity
public class HeroAdapter extends ArrayAdapter<Hero> implements Filterable {
private List<Hero> heroList;
public HeroAdapter(Context c, List<Hero> heroList) {
super(c, R.layout.layout_hero_list, heroList);
this.heroList = heroList;
}
然后,當您嘗試過濾時,您也會用一個空的“陰影”列表。 如果您閱讀警告,Android Studio甚至可能會向您指出這一點。
重命名為其他名稱
FilterResults results = new FilterResults();
List<Hero> filtered = new ArrayList<>();
constraint = constraint.toString().toLowerCase();
for (Hero h : MainActivity.this.heroList) {
if (h.getName().toLowerCase().startsWith(constraint)) {
filtered.add(h);
}
}
results.count = filtered.size();
results.values = filtered;
return results;
您已在onTextChanged()方法中使用了適配器的類名,而不是適配器的對象。
嘗試這個:
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
String text = editTextName.getText().toString().toLowerCase(Locale.getDefault());
adapter.filter(text);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.