2017-09-07 1 views
-1

Je veux appeler une fonction dans le ActivityClass.java, à partir de la classe RecyclerView.Adapter.android - Comment accéder/appeler une méthode dans ActivityClass.java à partir de RecyclerView.Adapter

ci-dessous est ma fonction ActivityClass.java:

public void payslipActivityNav() { 

     Bundle b = new Bundle(); 
     if (b != null) { 
      Intent intent = new Intent(HomePage.this, PayslipActivity.class); 
      b.putString("UserName", lblUserName.getText().toString()); 
      b.putString("UserDesignation", lblDesignation.getText().toString()); 
      intent.putExtras(b); 
      startActivity(intent); 
     } 
    } 

Et ceci est la classe dans ma classe RecyclerView.Adapter:

public class SingleItemRowHolder extends RecyclerView.ViewHolder { 

      protected TextView tvTitle; 

      protected ImageView itemImage; 
      protected TextView lblDescription; 

      public SingleItemRowHolder(final View view) { 
       super(view); 

       this.tvTitle = (TextView) view.findViewById(R.id.tvTitle); 
       this.itemImage = (ImageView) view.findViewById(R.id.itemImage); 
       this.lblDescription = (TextView) view.findViewById(R.id.lblDescription); 


       view.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         strSelectedText = tvTitle.getText().toString(); 
         Toast.makeText(v.getContext(), strSelectedText, Toast.LENGTH_SHORT).show(); 

         switch (strSelectedText){ 
          case "Pay": 
           ((ActivityClass)mContext).payslipActivityNav(); 
           break; 

         } 




        } 
       }); 


      } 

} 

C'est l'erreur que je reçois java.lang.ClassCastException: android.app.Application cannot be cast to packageName.ActivityClass

Y at-il un problème avec lequel j'accède à la méthode ActivityClass? Ou la méthode d'appel doit-elle être exécutée dans cette classe interne ou ailleurs dans la classe RecyclerView.Adapter.

L'aide serait appréciée.

Merci d'avance!

MISE À JOUR:

Je l'ai résolu en utilisant cela. Quelque chose a traversé mon esprit et j'ai essayé ceci et cela a fonctionné:

switch (strSelectedText){ 
         case "Pay": 
          Intent intent = new Intent(mContext.getApplicationContext(), ActivityClass.class); 
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
          mContext.startActivity(intent); 
          break; 

        } 

Merci à vous tous.

+0

vous pouvez utiliser l'interface à cette fin –

+0

je ne ai besoin d'appeler un à chaque méthode d'activité. Mais si vous avez un petit exemple pour cela, ce serait utile. –

+0

@RickyPatel Cela signifie que je devrais utiliser "public static void payslipActivityNav()", au lieu de "public void payslipActivityNav()"? –

Répondre

0

essayez ceci: ((YourActivity) contexte) .your_method(); // méthode doit être publique

+0

S'il vous plaît se référer le code, c'est exactement ce que j'utilise –

+0

au lieu de mContext essayer getActivity() peut aider dans votre cas –

+0

'getActivity 'n'est même pas la liste en tapant .. désolé. Aussi, je veux juste vous faire savoir "private Context mContext;" est déclaré globalement dans la classe d'adaptateur recycler view. –

0
public static void payslipActivityNav() { 

    Bundle b = new Bundle(); 
    if (b != null) { 
     Intent intent = new Intent(HomePage.this, PayslipActivity.class); 
     b.putString("UserName", lblUserName.getText().toString()); 
     b.putString("UserDesignation", lblDesignation.getText().toString()); 
     intent.putExtras(b); 
     startActivity(intent); 
    } 
} 

SingleItemRowHolder public class étend RecyclerView.ViewHolder {

 protected TextView tvTitle; 

     protected ImageView itemImage; 
     protected TextView lblDescription; 

     public SingleItemRowHolder(final View view) { 
      super(view); 

      this.tvTitle = (TextView) view.findViewById(R.id.tvTitle); 
      this.itemImage = (ImageView) view.findViewById(R.id.itemImage); 
      this.lblDescription = (TextView) view.findViewById(R.id.lblDescription); 


      view.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        strSelectedText = tvTitle.getText().toString(); 
        Toast.makeText(v.getContext(), strSelectedText, Toast.LENGTH_SHORT).show(); 

        switch (strSelectedText){ 
         case "Pay": 
          ActivityClass.payslipActivityNav(); 
          break; 

        } 




       } 
      }); 


     } 

}

+0

Il me donne l'erreur, "Méthode non statique 'startActivity (android.content.Intent)" ne peut pas être référencé à partir d'un contexte statique " –

+0

public static void payslipActivityNav (Contexte contexte) { Bundle b = nouveau Bundle(); if (b! = Null) { Intention intention = nouvelle intention (HomePage.this, PayslipActivity.class); b.putString ("UserName", lblUserName.getText(). ToString()); b.putString ("UserDesignation", lblDesignation.getText(). ToString()); intent.putExtras (b); context.startActivity (intention); Pls pass Contexte dans la méthode –

0

Vous devez utiliser l'interface de rappel pour ce faire. Et c'est le moyen sûr de mettre en œuvre cela. Le contexte de diffusion ne rendra pas le code réutilisable.

Vous devez créer une interface à l'intérieur de votre adaptateur et lui transmettre la valeur.

code Votre adaptateur devrait ressembler à ceci:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { 

private OnItemClickListener onItemClickListener; 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

} 

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 

} 

@Override 
public int getItemCount() { 

} 

public void setOnItemClickListener(OnItemClickListener onItemClickListener) { 
    this.onItemClickListener = onItemClickListener; 
} 

public void setData(List<AccountProvider> accountProviders) { 
    this.accountProviders = accountProviders; 
    notifyDataSetChanged(); 
} 

class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    MyViewHolder(View itemView) { 
     super(itemView); 
     itemView.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if (onItemClickListener != null) 
      onItemClickListener.onItemClick(tvTitle.getText().toString()); 
    } 
} 
} 

Interface:

public interface OnItemClickListener { 
     void onItemClick(String value); 
} 

Dans votre Activité:

public MyActivity implements OnItemClickListener{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    MyAdapter adapter = new MyAdapter(); 
    adapter.setOnItemClickListener(this); 
    yourRecyclerView.setAdapter(adapter); 
    } 

    @Override 
    public void onItemClick(String value){ 
     switch (strSelectedText){ 
     case "Pay": 
      payslipActivityNav(); 
      break; 
     } 
    } 

} 

Si vous avez besoin d'une valeur de votre adaptateur, vous pouvez le passer via l'interface.

Hope it helps :)

+0

Ceci est bien, mais seulement si vous appelez une méthode dans ActivityClass. Mais j'ai un interrupteur dans mon adaptateur, ce qui signifie que je dois appeler différentes fonctions dans la même classe d'activité, selon mes besoins. Que dire de cela? Mais merci pour ça! –

+0

Son simple faire l'interrupteur dans votre activité et passer le param nécessaire de l'adaptateur. ex: onItemClick (your_param) –

+0

attente, je fais des changements dans ma réponse pour votre exigence –