【发布时间】:2019-09-20 21:15:51
【问题描述】:
我正在使用带有自定义适配器的 ListView,并且我有一个 EditText 用于搜索列表。 当我在 EditText 中键入任何内容时,它会用 ListView 清空。 注意:我在片段中的对话框中显示 ListView
我也添加了 TextChangedListener。 不知道我哪里出错了。 请提出建议。
CompanyAdapter companyAdapter;
private void showCompaniesDialog(List<Company> companies) {
if(companies != null) {
final Dialog dialog = new Dialog(getContext());
// dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(false);
dialog.setContentView(R.layout.dialog_company_listview);
Button btndialog = (Button) dialog.findViewById(R.id.btndialog);
btndialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
ListView listView = (ListView) dialog.findViewById(R.id.listview);
companyAdapter = new CompanyAdapter(getActivity(), 0, companies);
listView.setAdapter(companyAdapter);
//HERE I SET THE TEXT FILTER ENABLED
listView.setTextFilterEnabled(true);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//textView.setText("You have clicked : " + companies[position]);
dialog.dismiss();
}
});
//HERE I ADD CHANGED LISTENER
EditText etSearch = (EditText) dialog.findViewById(R.id.etSearch);
etSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
companyAdapter.getFilter().filter(charSequence);
}
@Override
public void afterTextChanged(Editable editable) {
//companyAdapter.getFilter().filter(editable);
}
});
dialog.show();
}
}
公司适配器
public class CompanyAdapter extends ArrayAdapter<Company>{
private Activity activity;
private LayoutInflater inflater = null;
public CompanyAdapter (Activity activity, int textViewResourceId, List<Company> lCompany){
super(activity, textViewResourceId, lCompany);
try{
this.activity = activity;
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}catch (Exception e){
e.printStackTrace();
}
}
public Company getItem (Company position){
return position;
}
public long getItemId(int position){
return position;
}
public class ViewHolder {
public TextView display_name;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
final ViewHolder holder;
try {
if (convertView == null) {
vi = inflater.inflate(R.layout.company_list_item, null);
holder = new ViewHolder();
holder.display_name = (TextView) vi.findViewById(R.id.tvCompanyName);
vi.setTag(holder);
} else {
holder = (ViewHolder) vi.getTag();
}
holder.display_name.setText(getItem(position).getName());
} catch (Exception e) {
e.printStackTrace();
}
return vi;
}
}
名称字段的公司类
@SerializedName("name")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
【问题讨论】:
-
我没有看到你已经实现了过滤器。它不会神奇地理解你究竟想如何过滤它
-
@VladyslavMatviienko As Ganesh 建议我已经实现了 ItemFilter,我可以看到传递给 publishResults 方法的结果,但是 notifyDataSetChanged 不起作用,List 没有更新为新结果。关于我可能遗漏的任何建议
标签: android android-fragments android-listview android-arrayadapter