web-dev-qa-db-fra.com

Comment utiliser setTag et getTag avec un adaptateur personnalisé

Je suis coincé et j'ai besoin d'aide. J'essaie d'utiliser set et d'obtenir Tag, mais je ne comprends pas comment cela fonctionne pour cette action:

  • J'utilise la vue liste pour afficher les images chargées dans l'adaptateur étendu
  • L'adaptateur personnalisé gonfle une mise en page avec imageview_1, textview_1 et button_1
  • Sur mon activité principale, j'ai un "Public Void OnClickHandler" pour button_1 et a été configuré sur la mise en page avec "Android: onClick", donc quand on clique sur le bouton il fait quelque chose
  • Lorsque l'on clique sur le bouton_1, je souhaite obtenir le texte de textview_1 à partir de cette vue spécifique, puis charger une autre image. Je veux cela en utilisant get et set TAGS, donc je dois faire la référence avec button_1 et imageview_1. ici mon code coupé. Merci d'avance

L'adaptateur personnalisé

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;

    LayoutInflater mInflater = (LayoutInflater) 
        context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.itemstartsession, null);
        holder = new ViewHolder();

        holder.image = (WebView)convertView.findViewById(R.id.img_session);
        //holder.image.setTag(position);

        holder.code = (TextView)convertView.findViewById(R.id.code_item_session_text);
        //holder.code.setTag(position);


        holder.share=(ImageButton)convertView.findViewById(R.id.share_item_session_button);
        holder.share.setTag(position);

        convertView.setTag(holder);
    // Check if my setTag is ok for button and get the reference to get 
        //text from textview and the referece to webview, then I gonna load a url
    } else {

        holder=(ViewHolder)convertView.getTag();
    }

    StoreDataForBA storeItem= (StoreDataForBA) getItem(position);
    holder.image.loadUrl(storeItem.getImage());

        holder.code.setText(storeItem.getCode());

return convertView;
}

Ceci est mon getter et setter pour les données, très facile

public StoreDataForBA( String image, String code) {

    this.setImage(image);
    this.setCode(code);

}

public String getImage() {
    return image;
}

public void setImage(String image) {
    this.image = image;
}


public String getCode() {
    return code;
}

public void setCode(String code) {
    this.code = code;
}

Mon activité principale a été coupée

public void shareOnClickHandler(View v) {
// plz here i need the code to get the text from textview and also get the 
// reference of the webview, so i can do something like
// StoreDataForBA data = (StoreDataForBA)v.getTag();
// image2.loadUrl("http://image2")..... I'm not sure, thank you
}
12
Jonatan

votre code est un peu déroutant, donc je vous donne un exemple

Exemple de classe de balises

public class MyTag
{
   String  code;
   String  image;
   String  web_ref;

  public MyTag()
    {
     code=null;
     image=null;
     web_ref=null;
    }

    public MyTag(String cod,String img,String wref)
    {
      code=cod;
      image=img;
      web_ref=wref;
    }

}

vous voulez obtenir ces valeurs lorsque vous cliquez sur le bouton à droite? Mettez donc cet objet de classe de balises comme balise sur le bouton dans getView de votre adaptateur personnalisé

MyTag myTag=new MyTag("code","image","web_ref");
holder.button.setTag(myTag);

puisque vous obtenez la vue cliquée comme argument à la votre fonction

public void shareOnClickHandler(View v) 
{

   myTag=(MyTag)v.getTag();
   text=myTag.code;
   image2.loadUrl("http://"+myTag.image);//..... I'm not sure, thank you
   webview.loadUrl(mytag.web_ref);
}

Je pense que vous avez l'idée, essayez d'implémenter votre code avec cette idée

11
Fahad

Vous êtes très proche de votre réponse. Suivez simplement les modifications et complétez votre réponse

@Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;

        if ((convertView == null) || (convertView.getTag() == null)) {
            LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.list_item, null);
            holder = new ViewHolder();
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        convertView.setTag(holder);

        return convertView;
    }
5
Biraj Zalavadia

Réponse 1:

Ce que vous voulez faire:

au-dessus ou juste après cette ligne: holder.code.setText(storeItem.getCode()); ajoutez ce qui suit: holder.share.setTag(storeItem.getCode());

et dans onClick:

public void shareOnClickHandler(View v) {
    String code = v.getTag().toString();
    // plz here i need the code to get the text from textview and also get the 
    // reference of the webview, so i can do something like
    // StoreDataForBA data = (StoreDataForBA)v.getTag();
    // image2.loadUrl("http://image2")..... I'm not sure, thank you
}

Ou

Réponse 2:

Vous n'aurez peut-être pas besoin d'utiliser setTag et getTag si vous effectuez les opérations suivantes

  1. Accédez à votre xml et supprimez l'attribut onclick du bouton que nous allons utiliser dans le Java à la place
  2. Utilisez le getView suivant

    @Override public View getView (int position, View convertView, ViewGroup parent) {ViewHolder holder = null;

    LayoutInflater mInflater = (LayoutInflater) 
        context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.itemstartsession, null);
        holder = new ViewHolder();
        holder.image = (WebView)convertView.findViewById(R.id.img_session);
        holder.code = (TextView)convertView.findViewById(R.id.code_item_session_text);                  
        holder.share=(ImageButton)convertView.findViewById(R.id.share_item_session_button);
        convertView.setTag(holder);
    // Check if my setTag is ok for button and get the reference to get 
        //text from textview and the reference to webview, then I gonna load a url
    } else {
        holder=(ViewHolder)convertView.getTag();
    }
    
    final StoreDataForBA storeItem= (StoreDataForBA) getItem(position); // final to use inside click
    holder.image.loadUrl(storeItem.getImage());
    holder.code.setText(storeItem.getCode());
    final ViewHolder fh = holder; // it needs to be final to use inside of clicklistener
    holder.share.setOnClickListener(new OnClickListener() {
    
        @Override
        public void onClick(View v) {
            String text = holder.code.getText().toString(); // I hope that this is what you need.
            String text2 = storeItem.getCode(); //use either but I prefer this.
        }
    });
    return convertView;
    }
    
1
Shereef Marzouk