Je sais qu'il y a d'autres questions comme celle-ci avec des réponses mais elles ne m'aident pas ...
J'ai donc un Fragment, dans celui-ci j'utilise Volley pour obtenir un JSON à partir d'une API Web. Ce que je veux faire, c'est "actualiser" ma vue recycleur avec les données que j'obtiens dans ma réponse.
J'ai essayé d'ajouter une méthode dans mon adaptateur. Mais rien n'ajoute lorsque j'essaye de changer mon adaptateur dans ma méthode Volley.onresponse ().
Voici mon fragment:
@Override
public int getItemCount() {
return TI.size();
}
Il y a mon adaptateur:
public void getList(ArrayList<String> nomUser, ArrayList<String> date){
for(int i =1; i<nomUser.size();i++){
TI.add(Pair.create(nomUser.get(i), date.get(i)));
}
notifyDataSetChanged();
}
Et il y a la mise en page:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listview_TI"
android:layout_width="97dp"
android:layout_height="34dp"
android:layout_marginTop="24dp"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.917"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.976" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="409dp"
android:layout_height="680dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.039" />
</androidx.constraintlayout.widget.ConstraintLayout>
Merci pour votre aide
MISE À JOUR:
Maintenant mon MyAdapter.getList () ressemble à ceci:
public class MyAdapterTI extends RecyclerView.Adapter<MyAdapterTI.MyViewHolder> {
private List<Pair<String, String>> TI;
public void getList(ArrayList<String> nomUser, ArrayList<String> date){
for(int i =0; i<nomUser.size();i++){
TI = Arrays.asList( Pair.create(nomUser.get(i), date.get(i)));
}
}
@NonNull
@Override
public MyAdapterTI.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.list_cell_ti, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyAdapterTI.MyViewHolder holder, int position) {
Pair<String, String> pair = TI.get(position);
holder.display(pair);
}
@Override
public int getItemCount() {
return 0;
}
public class MyViewHolder extends RecyclerView.ViewHolder{
private TextView nomUser;
private TextView date;
private Pair<String, String> currentPair;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
nomUser=(TextView)itemView.findViewById(R.id.nomuser);
date=(TextView)itemView.findViewById(R.id.date);
itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
}
});
}
public void display(Pair<String, String> pair) {
currentPair=pair;
nomUser.setText(pair.first);
date.setText(pair.second);
}
}
}
Mais rien n'a encore changé.
Dernière MISE À JOUR:
Le problème a été résolu.
C'est une erreur ridicule que j'ai faite dans mon adaptateur.
J'avais l'habitude de renvoyer 0 mais la solution est la suivante:
public class TicketsIncidentsFragment extends Fragment implements Response.ErrorListener, Response.Listener<String> {
RequestQueue queue;
StringRequest stringRequest;
ListView listView;
private RecyclerView recyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager layoutManager;
String url;
private TicketsIncidentsViewModel ticketsIncidentsViewModel;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
ticketsIncidentsViewModel =
ViewModelProviders.of(this).get(TicketsIncidentsViewModel.class);
View root = inflater.inflate(R.layout.fragment_ticketsincidents, container, false);
return root;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
RecyclerView recyclerView = (RecyclerView)getView().findViewById(R.id.recyclerview);
recyclerView.setHasFixedSize(true);
layoutManager= new LinearLayoutManager(getActivity().getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
MyAdapterTI myAdapterTI=new MyAdapterTI();
recyclerView.setAdapter(myAdapterTI);
queue = Volley.newRequestQueue(getActivity().getApplicationContext());
url = "http://myip/select/ticketsI";
stringRequest = new StringRequest(GET, url, TicketsIncidentsFragment.this, TicketsIncidentsFragment.this);
queue.add(stringRequest);
}
@Override
public void onErrorResponse(VolleyError error) {
}
@Override
public void onResponse(String response) {
RecyclerView recyclerView = (RecyclerView)getView().findViewById(R.id.recyclerview);
Gson gsonTicketsIncidents = new Gson();
ResponseJson responseJson = new ResponseJson();
responseJson = (ResponseJson) gsonTicketsIncidents.fromJson(response, ResponseJson.class);
List<Object> listTicketsIncidents = responseJson.getResponse();
try {
JSONArray tis = new JSONArray(listTicketsIncidents.toArray());
ArrayList<String> date = new ArrayList<String>();
ArrayList<String> nomUser = new ArrayList<String>();
for (int i = 0 ; i< tis.length(); i++) {
JSONObject ticketIncident = tis.getJSONObject(i);
nomUser.add(ticketIncident.get("NOMUSER").toString());
date.add(ticketIncident.get("DateSAISIE").toString());
}
MyAdapterTI myAdapterTI=new MyAdapterTI();
myAdapterTI.getList(nomUser, date);
recyclerView.setAdapter(myAdapterTI);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
3 Réponses :
this.notifyDataSetChanged(); ////in getList
d'abord, vous pouvez essayer ceci dans l'adaptateur this.notifyDataSetChanged (); //// dans getList
ce problème résoudra après avoir fait cela sinon dites-moi
oui j'ai essayé, j'ai mis le changement dans ma question à la fin avec la section "MISE À JOUR"
vous avez utilisé this.notifyDataSetChanged ();
@Ahmad J'ai mis le this.notifyDataSetChanged () dans la méthode getList. Où est-ce que j'utilise le clear?
Vous pouvez effacer la liste précédente dans la fonction getList (....) de l'adaptateur dans la fonction getList () que vous pouvez faire TI.clear
Ok maintenant je le fais, mais rien ne s'est passé, j'ai le débogage étape par étape et tout va bien, mais je ne trouve pas pourquoi le recyclerView n'apparaît jamais
private List<Pair<String, String>> TI = new ArrayList();
public void getList(ArrayList<String> nomUser, ArrayList<String> date){
for(int i =0; i<nomUser.size();i++){
TI.add(Pair.create(nomUser.get(i), date.get(i)));
}
notifyDataSetChanged();
}
remplacez simplement
@Override
public int getItemCount() {
if(TI == null)
return 0;
else
return TI.size;
}
par
@Override
public int getItemCount() {
return 0;
}
essayez adapter.notifyDataSetChanged () après avoir défini les données sur l'adaptateur
êtes-vous sûr que onResponse est appelé? avez-vous essayé de le déboguer?
@MirzaAhmedBaig J'ai essayé aussi mais rien ne s'est passé ...
@RofieSagara Oui, ça s'appelle
change TI = Arrays.asList (Pair.create (nomUser.get (i), date.get (i))); à Ti.add (Pair.create (nomUser.get (i), date.get (i))
en réponse, essayez d'abord d'effacer votre liste, puis ajoutez à nouveau la nouvelle liste à l'adaptateur, puis appelez notifyDataset changed
Liste privée> TO = new ArrayList (); et ça aussi
@RofieSagara oui j'y pensais au début mais il n'y a pas de Pair.add ...
pas Pair.add () mais IT.add ()
@RajatBeck Je comprends, pouvez-vous m'aider à savoir comment effacer ma liste? C'est la première fois que j'utilise RecyclerView ...
Il y a deux ou trois choses que vous faites mal renvoyer
TI.size ()dans votre fonctiongetItemCount, et dans votre fonction getList, appelez d'abordTI.clear ()puis préparez une nouvelle liste, puis faitesnotifyDataSetChanged.@RajatBeck OH, je pense que c'est sur la bonne voie, sachez que cela fonctionne, j'ai juste un espace énorme entre les éléments, mais je vais travailler pour cela. Tahnk est beaucoup
@NeoKerd upvote s'il vous plaît, le commentaire vous a aidé.
@RajatBeck C'est fait