2017-09-01 1 views
0

J'utilise Retrofit pour charger les données de mon serveur dans un RecyclerView. J'ai implémenté avec succès les méthodes de conversion Get, et Post mais je suis confronté à quelques problèmes pour les Put et Delete. Depuis ReclyclerView nécessite un Adapter pour charger les données, et je dois obtenir la position de la ligne que je clique, je devais implémenter le onKeyPressed (parce que j'utilise et EditText) à l'intérieur de mon Adapter.Appel d'une méthode depuis Activity in Adapter

Le problème est que la méthode qui appelle mon Interceptor, l'appel Retrofit et tout est dans mon Activity. J'ai donc décidé d'appeler la méthode de cette activité à l'intérieur de mon adaptateur pour faire la mise et la suppression d'un élément singulier. Mais je reçois un

java.lang.ClassCastException disant que la méthode ne peut pas être casté à l'adaptateur.

Ceci est la méthode onKeyPressed, ViewCategoryActivity Sí mon activité et SendNetworkRequest est ma méthode:

holder.nameCategory.setOnKeyListener(new View.OnKeyListener() { 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       // If the event is a key-down event on the "enter" button 
       if ((event.getAction() == KeyEvent.ACTION_DOWN) && 
         (keyCode == KeyEvent.KEYCODE_ENTER)) { 

        System.out.println("Entrou no adapter!!"); 
        Category2 category = new Category2(); 
        category.setName(holder.nameCategory.getText().toString()); 
        ((ViewCategoriesActivity)mContext).SendNetworkRequest(categoryList.get(position).getProjectId(), 2, categoryList.get(position).get_id(), new SendCategory(holder.nameCategory.getText().toString())); 

        //Variable to check if the category inserted is equal to a previous one 
        int bool = 0; 
        //The for goes through the list and tries to find a category with the name equal to the one inserted 
        for (int i = 0; i < categoryList.size(); i++){ 

         //if it finds equal names bool = 1 
         if (categoryList.get(i).getName().equals(holder.nameCategory.getText().toString())){ 
          bool = 1; 
          Toast.makeText(mContext, mContext.getResources().getString(R.string.category_different_name), 
            Toast.LENGTH_LONG).show(); 
         } 
        } 

        //There's no category with the same name so it' OK so insert a new one 
        if (bool == 0){ 

         if(mContext instanceof ViewCategoriesActivity){ 
          ((ViewCategoriesActivity)mContext).SendNetworkRequest(categoryList.get(position).getProjectId(), 2, categoryList.get(position).get_id(), new SendCategory(holder.nameCategory.getText().toString())); 
         } 
         //categoryList.add(category); 

        } else { 

        } 


        // hide virtual keyboard 
        InputMethodManager imm = 
          (InputMethodManager)mContext.getSystemService(Context.INPUT_METHOD_SERVICE); 
        imm.hideSoftInputFromWindow(holder.nameCategory.getWindowToken(), 0); 
        return true; 
       } 
       return false; 
      } 
     }); 
+0

ne faites pas cela. Utilisez un rappel à la place –

+0

quelle méthode ne peut pas être lancée? – Vyacheslav

+0

poster votre callstack – Vyacheslav

Répondre

1

Vous devriez être passer un auditeur de votre activité à l'adaptateur. Vous devriez alors utiliser cet écouteur pour appeler la fonction dans votre activité. à-dire, si vous appelez votre adaptateur comme suit,

adapter = new DataAdapter(data); 

où les données peuvent être un arraylist (supposons), passe alors le contexte comme celui-ci

adapter = new DataAdapter(data,ViewCategoriesActivity.this); 

Acceptez cet écouteur à l'aide d'un constructeur dans votre adaptateur, puis appelez votre fonction d'activité comme listener.yourFunction()

+0

Je n'ai pas compris votre réponse, pourriez-vous m'expliquer un peu plus? –

+0

dans votre activité: adapter = new DataAdapter (data, ViewCategoriesActivity.this); dans votre classe d'adaptateur: DataAdapter publique (données chaîne, l'activité d'activité) { } – CharlieNorris

+0

et chaque fois que nécessaire activity.SendNetworkRequest d'appel() –

0

Vous pouvez le faire en utilisant l'auditeur facilement, essayez de ne pas rendre votre code si complexe. Comme je sais que votre problème a une bonne réponse here, espérons que cela fonctionnera.