J'ai ce ArrayAdapter:adaptateur RAID ne met pas à jour
public class PlacesAutoCompleteAdapter extends ArrayAdapter<String> implements Filterable{
List<String> resultList;
private OnAutoCompleteListener listener;
private Context mContext;
private int mResource;
public PlacesAutoCompleteAdapter(Context context, int resource,List<String>resultList, OnAutoCompleteListener listener) {
super(context, resource);
mContext = context;
mResource = resource;
this.resultList = resultList;
this.listener = listener;
}
@Override
public int getCount() {
// Last item will be the footer
return resultList.size();
}
public void updateList(List<String>values){
this.resultList = values;
notifyDataSetChanged();
}
@Override
public String getItem(int position) {
return resultList.get(position);
}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
if (constraint != null) {
List<String> resultList = listener.onAutoComplete(constraint.toString());
Log.d(getClass().getName(),String.valueOf(resultList.size()));
filterResults.values = resultList;
filterResults.count = resultList.size();
}
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results != null && results.count > 0) {
notifyDataSetChanged();
}
else {
notifyDataSetInvalidated();
}
}
};
return filter;
}
}
qui donne des résultats de cette Flowable:
void addToList(Places places){
places.getPredictions().stream().forEach(s->System.out.println(s.getDescription()));
places.getPredictions()
.stream()
.map(s->resultList.add(s.getDescription()));
}
@Override
public List<String> loadPlaces(String input) {
HappyParkApp.getInstance().createAppComponent().inject(this);
PlaceAPIService service = retrofit.create(PlaceAPIService.class);
Flowable<Places> places = service.getPlaces(Constants.APIKEY,Constants.TYPES,Constants.LANGUAGE,Constants.COMPONENTS,input);
places.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(newPlace -> addToList(newPlace));
return resultList;
}
}
ce qui est le service:
public interface PlaceAPIService {
@GET("json")
Flowable<Places> getPlaces(@Query("key")String API,
@Query("types")String address,
@Query("language")String language,
@Query("components")String component,
@Query("input") String input);
}
c'est correct et je pouvais voir un journal pour savoir si le service est bon. Le problème est que le journal qui montre l'élément dans l'adaptateur est toujours 0. Pourquoi? Où puis-je mettre à jour l'adaptateur?
Merci
EDIT: ce sont modèle, vue et présentateur:
public class APIModel implements AddWithText.Model {
@Inject
Retrofit retrofit;
AddWithText.Presenter presenter;
public APIModel(AddWithText.Presenter presenter) {
this.presenter = presenter;
}
final List<String> resultList = new ArrayList<>();
void addToList(Places places){
places.getPredictions().stream().forEach(s->System.out.println(s.getDescription()));
places.getPredictions()
.stream()
.map(s->resultList.add(s.getDescription()));
}
@Override
public List<String> loadPlaces(String input) {
HappyParkApp.getInstance().createAppComponent().inject(this);
PlaceAPIService service = retrofit.create(PlaceAPIService.class);
Flowable<Places> places = service.getPlaces(Constants.APIKEY,Constants.TYPES,Constants.LANGUAGE,Constants.COMPONENTS,input);
places.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(newPlace -> addToList(newPlace));
return resultList;
}
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_add_with_text, container, false);
ButterKnife.bind(this,rootView);
HappyParkApp.getInstance().createAppComponent().inject(this);
presenter = new AddWithTextPresenter();
adapter = new PlacesAutoCompleteAdapter(getActivity(),R.layout.list_item,autoComplete,this);
DatabaseReference root = FirebaseDatabase.getInstance().getReference();
final DatabaseReference condition = root.child("condition");
insertText.setAdapter(adapter);
return rootView;
}
@Override
public void onResume() {
super.onResume();
presenter.setView(this);
}
@Override
public List<String> onAutoComplete(String character) {
List<String> result = presenter.onTextChanged(character);
return result;
}
@Override
public void refreshList(List<String> resultList) {
adapter.updateList(resultList);
}
public class AddWithTextPresenter implements AddWithText.Presenter {
AddWithText.View view;
AddWithText.Model model;
@Inject
public AddWithTextPresenter(){
model = new APIModel(this);
}
@Override
public void onComplete(List<String> resultList) {
view.refreshList(resultList);
}
@Override
public void setView(AddWithText.View view) {
this.view = view;
}
@Override
public List<String> onTextChanged(String character) {
return model.loadPlaces(character);
}
}
Ajoutez le code dans lequel vous définissez l'adaptateur à lister. – androidnoobdev
@androidnoobdev question éditée – nani