问题 如何使用自定义适配器的setTag和getTag


我被困了,我需要帮助。我正在尝试使用set并获取Tag但我无法了解它对此操作的工作原理:

  • 我正在使用列表视图来显示加载到扩展适配器的图像
  • 自定义适配器使用imageview_1,textview_1和button_1为布局充气
  • 在我的主要活动中,我有一个用于button_1的“Public Void OnClickHandler”,并且在布局上配置了“android:onClick”,所以当点击按钮时它会做一些事情
  • 单击button_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;
}

这是我的数据获取器和设置器,非常简单

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
}

3065
2018-05-12 03:25


起源

为什么你不必在适配器类中调用button_1的click监听器?它太容易而不是你的方法.... - dipali
@dipali因为我必须在该按钮中执行更复杂的操作,我想知道如何正确使用该标签,但我想如果我使用内部适配器是相同的代码.. u.u - Jonatan
问题是什么,预期的行为是什么以及发生了什么? - Shereef Marzouk
@Shereef - 我需要知道shareOnClickListener中的代码是什么,使用“getTag”从Convertview获取文本,并从WebView获取引用..需要帮助! - Jonatan
你能解释一下吗? - Shereef Marzouk


答案:


你的代码有点混乱,所以我给你一个样本

示例Tag类

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

我想你明白了,试着用这个想法来实现你的代码


11
2018-05-12 05:00



好的,我打算尝试一下,我确定我错过了一些东西,也许我需要休息一下,谢谢 - Jonatan
@Shereef谢谢你,我看到了我的错误,我应该在这行“holder.code.setText(storeItem.getCode())”之后使用setTag。使用“holder.share.setTag(storeItem.getCode())”,这是你的通用答案!! :d - Jonatan


你非常接近你的答案。只需按照更改完成并完成答案

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

4
2018-05-12 05:07



@ Biraj好的,如果我在我的自定义适配器上添加了这些更改,那么在我的“public void shareOnClickHandler(View v)”中使用getTag的代码是什么来获取textview中的文本? TY - Jonatan
没有得到更准确的说服。 - Biraj Zalavadia
@ Biraj - 好的..我有一个listview,它使用一个带有3个视图的自定义适配器:Textview,Webview和Button,所以当我在Main Activity上使用SetAdapter第一时间时,我加载了listview的视图(webview,textview和button)好的..继续 - Jonatan
..但是我需要向我的Button添加2个动作,1是从textView获取文本(显然是从同一个视图),因为这个文本有一个idText,它包含调用保存在SharedPreference上的另一个文本的键,正好是一个来自图像,和(2动作)这个图像将在webView中加载,更改原始(flipimage),我需要在我的主要活动(shareOnClickListener方法)中使用getTag,这是我需要的代码,希望这个帮助 - Jonatan


答案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 如果你这样做

  1. 转到你的xml并从我们将在Java中使用它的按钮中删除onclick属性
  2. 使用以下getView

    @覆盖 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
2018-05-12 05:35



好的我会去尝试一下,我真的很感谢你的时间,我现在无法测试'因为我的网络服务已经关闭=(,当它工作时我会测试它并检查它就像答案谢谢你! - Jonatan
慢慢来 :) - Shereef Marzouk