【发布时间】:2019-05-01 16:45:54
【问题描述】:
您好,我在 Dialog 中有一个 listView,并且我已经为 Dialog 设置了一个自定义适配器。
我查找并设置了 addTextChangedListener 但似乎不起作用。
我只想在用户输入编辑文本时搜索列表并刷新列表
请知道我哪里弄错了
这是我的代码
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);
//ArrayAdapter arrayAdapter = new ArrayAdapter(getContext(), R.layout.company_list_item, R.id.tv, companies);
CompanyAdapter 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.toString());
}
@Override
public void afterTextChanged(Editable editable) {
companyAdapter.getFilter().filter(editable);
}
});
dialog.show();
}
}
这是公司的自定义适配器
public class CompanyAdapter extends ArrayAdapter<Company>{
private Activity activity;
private List<Company> lCompany;
private LayoutInflater inflater = null;
public CompanyAdapter (Activity activity, int textViewResourceId, List<Company> lCompany){
super(activity, textViewResourceId, lCompany);
try{
this.activity = activity;
this.lCompany = lCompany;
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}catch (Exception e){
e.printStackTrace();
}
}
public int getCount(){
return lCompany.size();
}
public Company getItem (Company position){
return position;
}
public long getItemId(int position){
return position;
}
public class ViewHolder {
public TextView display_name;
}
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(lCompany.get(position).getName());
} catch (Exception e) {
e.printStackTrace();
}
return vi;
}
}
任何建议都会很有帮助
【问题讨论】:
-
您将自己的
List与ArrayAdapter内部维护的ArrayAdapter分开,并对其进行过滤。只需删除您的private List<Company> lCompany;字段和使用它的覆盖,然后使用getItem(position)代替getView()中的lCompany.get(position)。然后只需确保您的Company类有一个toString()覆盖,它返回getName()- 或其相应的字段 - 并且ArrayAdapter的内置Filter将为您工作。 -
@MikeM。我试过了,当我在 EditText 中输入内容时,它会清空列表并且不过滤。当你说覆盖 toString.在 Company 类中,我有 @SerializedName("name") private String name; public String getName() { 返回名称;它已经返回一个字符串,所以我应该在这里做其他事情吗?另一点,当我输入一些内容时,它会清空列表,当我删除我输入的文本时,列表又回来了。任何想法可能发生的事情
-
你必须专门重写
toString()方法;@Override public String toString() { return name; }。事实上,您根本不需要自定义Adapter,如果您唯一要做的就是设置TextView的文本。将toString()覆盖添加到Company,然后添加ArrayAdapter<Company> companyAdapter = new ArrayAdapter<>(getActivity(), R.layout.company_list_item, R.id.tvCompanyName, companies);。就是这样。
标签: android search android-listview android-dialog