2017-05-15 1 views
1

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); 

} 

}

+0

Ajoutez le code dans lequel vous définissez l'adaptateur à lister. – androidnoobdev

+0

@androidnoobdev question éditée – nani

Répondre

1

que vous faites mal ici

adapter = new PlacesAutoCompleteAdapter(getActivity(),R.layout.list_item,autoComplete,this); 

adaptateur vous avez 4 paramètres et vous passez seulement 3.

Deuxième Vérifiez que vous obtenez des données ici -

@Override 
public List<String> onAutoComplete(String character) { 
    List<String> result = presenter.onTextChanged(character); 
    return result; 
} 

si oui, vos données ne passent pas à l'adaptateur où. Ajoutez une méthode comme setData() dans l'adaptateur, puis transmettez-lui la liste de données. ajoutez les méthodes suivantes

public List<String> getData() { 
    return resultList; 
} 

public void setData(List<String> mData) { 
    this.resultList = mData; 
} 

public void addItems(List<String> mData) { 

    if (this.resultList != null) { 
     this.resultList.addAll(mData); 
     notifyItemInserted(this.resultList.size()); 
    } 
} 
+0

merci mais malheureusement ne fonctionne pas .. je pense que le problème est que dans l'appel rx arrive plus tard que l'appel de l'adaptateur .. est-il un bon moyen de le résoudre? – nani

+0

Oui, il y a tellement de façons avec Rx. Je n'ai pas utilisé Rx dans un projet mais je sais qu'il a une certaine méthode quand il met fin à l'envoi de données à l'abonné. vous pouvez vérifier cette méthode, puis définir l'adaptateur pour la liste. – androidnoobdev

+0

merci ça marche bien;) – nani