Как использовать setTag и getTag с пользовательским адаптером

Я застрял, и мне нужна помощь. Я пытаюсь использовать set и get Tag, но я не могу понять, как он работает для этого действия:

  • Я использую представление списка, чтобы показывать изображения, загруженные в расширенный адаптер.
  • Пользовательский адаптер раздувает макет с помощью imageview_1, textview_1 и button_1
  • В моей основной деятельности у меня есть "Public Void OnClickHandler" для button_1 и был сконфигурирован в макете с "android: onClick", поэтому, когда кнопка нажата, она что-то делает
  • Когда нажата кнопка_1, я хочу получить текст из textview_1 из этого конкретного представления, а затем загрузить другое изображение. Я хочу это сделать с помощью get и set TAGS, поэтому мне нужно сделать ссылку с помощью кнопок button_1 и imageview_1. вот мой отрезанный код. Заранее благодарю

Пользовательский адаптер

@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;
}

Это мой getter и setter для данных, очень легкий

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

Моя основная деятельность отключена

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
}

Ответ 1

ваш код немного запутан, поэтому я даю вам образец

Класс тегов

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

}

вы хотите получить эти значения при нажатии кнопки справа? Поэтому поместите этот объект класса тега как тег на кнопку в getView вашего пользовательского адаптера

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

так как вы получаете представление, нажатое как аргумент для вашей функции

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

Я думаю, вы поняли, попытайтесь реализовать свой код с этой идеей

Ответ 2

Вы очень близки к своему ответу. Просто выполните изменения и завершите свой ответ

@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;
    }

Ответ 3

Ответ 1:

Что вы хотите сделать:

выше или сразу после этой строки: holder.code.setText(storeItem.getCode()); добавить следующее: holder.share.setTag(storeItem.getCode());

и в 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
}

или

Ответ 2:

Вам может не понадобиться использовать setTag и getTag, если вы выполните следующие

  • Перейдите в свой xml и удалите атрибут onclick из кнопки, которую мы будем использовать в Java вместо
  • Используйте следующий getView

    @Override public Посмотреть getView (int position, View convertView, родительский элемент ViewGroup) {   Держатель ViewHolder = 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;
    }