مشکل استفاده نکردن Filter در adapter برای AutoCompleteTextView
سلام خدمت همه دوستان
مقدمه : بنده دو AutoCompleteTextView دارم در دو فرگمنت جدا که از یک adapter استفاده میکنند و در adapter هم مدل ها از کلاسی به اسم BaseModel ارث بری میکنند.بنده بصورت تستی قبل اینکه شروع کنم به نوشتن اول با String تست کردم و با مشکلی روبرو نشدم (البته شدم :دی)
حالا که دارم از مدل ها استفاده میکنم با مشکل عجیب و غریبی برخوردم که به این شرحه :
در adapter که فیلتر تعریف شده لاگ گرفتم و در واقع عمل میکنه(مثلا اگه ورودی "سردرد" باشه لاگ طول آرایه رو نشون میده که دوتا هست ("سردرد های مکرر") حالا در نمایش، Filter نادیده گرفته میشه و همه آیتم ها نمایش داده میشه (بجای اینکه suggestions رو نشون بده) ولی اگه دیتایی وارد بشه که وجود نداشته باشه لیست محو میشه.
مشکلی هم وجود داشت که حلش کردم ولی فکر کنم کمک کنه به پیدا کردن مشکل اصلی؛ این بود در اولین تلاش برای اجرا گرفتن ، در نمایش لیست اسامی آیتم ها از toString() که توی مدل اورراید کرده بودم میومد :|(در واقع متد getView اداپتر رو نادیده گرفته شده) که با برگردوندن name داخل toString() مشکل نمایش اسم حل شد.
مشکلی هم توی انتخاب آیتم ها وجود نداره.
حالا کد ها :
AutoCompleteAdapter.java
public class AutoCompleteAdapter extends ArrayAdapter<BaseModel> {
private Context context;
private int resourceId;
private int textviewId;
private List<BaseModel> items, tempItems, suggestions;
public AutoCompleteAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull ArrayList<BaseModel> objects) {
super(context, resource, textViewResourceId, objects);
this.items = objects;
this.context = context;
this.resourceId = resource;
this.textviewId = textViewResourceId;
this.tempItems = new ArrayList<>(objects);
suggestions = new ArrayList<>();
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View view = convertView;
BaseModel item = getItem(position);
try {
if (convertView == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
view = inflater.inflate(resourceId, parent, false);
}
TextView textView = view.findViewById(R.id.txt_name);
textView.setText(item.getName());
} catch (Exception e) {
e.printStackTrace();
}
return super.getView(position, convertView, parent);
}
@Nullable
@Override
public BaseModel getItem(int position) {
return items.get(position);
}
@Override
public int getCount() {
return items.size();
}
@NonNull
@Override
public Filter getFilter() {
return autoCompleteFilter;
}
private Filter autoCompleteFilter = new Filter() {
@Override
public CharSequence convertResultToString(Object resultValue) {
BaseModel item = (BaseModel) resultValue;
return item.getName();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (constraint != null) {
suggestions.clear();
for (BaseModel item : tempItems) {
if (item.getName().startsWith(constraint.toString())) {
suggestions.add(item);
}
}
FilterResults results = new FilterResults();
results.values = suggestions;
results.count = suggestions.size();
return results;
} else
return new FilterResults();
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
ArrayList<BaseModel> tempValues =(ArrayList<BaseModel>)results.values;
if (results!= null && results.count > 0) {
clear();
addAll(tempItems);
notifyDataSetChanged();
Log.d(DocyRequest.TAG, "publishResults: tempValues count:" + tempValues.size());
} else {
clear();
notifyDataSetChanged();
}
}
};
}
RegularSearchFragment.java
public class RegularSearchFragment extends Fragment {
private ArrayList<BaseModel> allSgins = new ArrayList<>();
private AutoCompleteAdapter adapter;
private RecyclerView recyclerView;
private ArrayList<BaseModel> selectedSigns;
private SelectedRecyclerAdapter recyclerAdapter;
private CircularProgressButton btnVisit;
private AppCompatAutoCompleteTextView autoCompleteTextView;
public RegularSearchFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_regular_search, container, false);
autoCompleteTextView = root.findViewById(R.id.input_search);
btnVisit = root.findViewById(R.id.btn_search);
recyclerView = root.findViewById(R.id.list_signs);
selectedSigns = new ArrayList<>();
recyclerAdapter = new SelectedRecyclerAdapter(selectedSigns);
recyclerView.setLayoutManager(new GridLayoutManager(root.getContext(), 4));
recyclerView.setAdapter(recyclerAdapter);
btnVisit.setOnClickListener(v -> {
btnVisit.startAnimation();
DocyRequest request = new DocyRequest(getContext());
HashMap<String, ArrayList<BaseModel>> map = new HashMap<>();
map.put("selected_signs", selectedSigns);
request.visit(map, results -> {
btnVisit.revertAnimation();
Log.d(DocyRequest.TAG, "onCreateView: result size: " + results.size());
});
});
fetchAllSigns();
return root;
}
private void fetchAllSigns() {
DocyRequest request = new DocyRequest(getContext());
request.getAllSigns(signs -> {
Log.d(DocyRequest.TAG, "fetchAllSigns: size:" + signs.size());
allSgins.clear();
allSgins.addAll(signs);
adapter = new AutoCompleteAdapter(
getContext(),
R.layout.auto_compelete_row,
R.id.txt_name,
allSgins
);
autoCompleteTextView.setThreshold(2);
autoCompleteTextView.setAdapter(adapter);
});
}
}
BaseModel.java
public class BaseModel {
public void setName(String name) {
this.name = name;
}
public void setDescription(String description) {
this.description = description;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@SerializedName("name")
private String name;
@SerializedName("description")
private String description;
@SerializedName("_id")
protected String id;
public String getName() {
return name;
}
public String getDescription() {
return description;
}
}
Sign.java
public class Sign extends BaseModel{
@SerializedName("disease_ids")
@Expose
private List<String> diseaseIds = null;
@SerializedName("document_ids")
@Expose
private List<String> documentIds = null;
public Sign(String name) {
super.setName(name);
}
public Sign() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return super.getName();
}
public void setName(String name) {
super.setName(name);
}
public String getDescription() {
return super.getDescription();
}
public void setDescription(String description) {
super.setDescription(description);
}
public List<String> getDiseaseIds() {
return diseaseIds;
}
public void setDiseaseIds(List<String> diseaseIds) {
this.diseaseIds = diseaseIds;
}
public List<String> getDocumentIds() {
return documentIds;
}
public void setDocumentIds(List<String> documentIds) {
this.documentIds = documentIds;
}
@NonNull
@Override
public String toString() {
return getName();
}
}
پیشاپیش سپاسگذارم از کمک دوستان.
همیشه تجربه ثابت کرده مشکلات عجیب و غریب منبعشون اشتباهات کوچیکه :دی
ArrayList<BaseModel> tempValues =(ArrayList<BaseModel>)results.values;
if (results!= null && results.count > 0) {
clear();addAll(tempItems);addAll(tempValues);
notifyDataSetChanged();
Log.d(DocyRequest.TAG, "publishResults: tempValues count:" + tempValues.size());
} else {
clear();
notifyDataSetChanged();
}
اثرات استفاده از Intelisense اندروید استودیو :|
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .