0
votes

Mettre à jour la vue du recycleur sur un fragment

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

    }
}


14 commentaires

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 fonction getItemCount , et dans votre fonction getList, appelez d'abord TI.clear () puis préparez une nouvelle liste, puis faites notifyDataSetChanged .


@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


3 Réponses :


1
votes
this.notifyDataSetChanged(); ////in getList

7 commentaires

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



1
votes
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();
}

0 commentaires

1
votes

remplacez simplement

@Override
    public int getItemCount() {
      if(TI == null)
        return 0;
      else 
       return TI.size;
    }

par

@Override
        public int getItemCount() {
            return 0;
        }


0 commentaires