2014-05-12 15 views
11

Utknąłem i potrzebuję pomocy. Próbuję użyć zestaw i uzyskać etykietę, ale nie mogę dostać jak to działa dla tej akcji:Jak korzystać z setTag i getTag z niestandardowym adapterem

  • używam widoku listy, aby pokazać obrazów załadowanych do rozszerzonej karty
  • Zwyczaj Adapter nadmuchać układ z imageview_1, textview_1 i button_1
  • na mojej podstawowej działalności, mam „void OnClickHandler publiczny” dla button_1 i został skonfigurowany na układ z „android: onClick”, więc po kliknięciu przycisku zrobić coś
  • kiedy button_1 jest kliknięty, chcę uzyskać tekst z textview_1 z tego konkretnego widoku, a następnie załadować inny obraz. Chcę do tego użyć get i set TAGS, więc muszę wykonać referencję za pomocą przycisku_1 i imageview_1. tutaj mój wycięty kod. Z góry dziękuję

Zwyczaj Adapter

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

To mój getter i setter danych, bardzo łatwy

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

Mój główny aktywny snipped

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 
} 
+0

czemu nie trzeba zadzwonić kliknij słuchaczem button_1 w klasie adaptera? Jej zbyt łatwe, a następnie ur metoda .... – dipali

+0

@dipali Bo mam zrobić bardziej skomplikowane działania w tym przycisku , Chcę wiedzieć, jak właściwie używać tych tagów, ale domyślam się, że jeśli użyję wewnętrznego adaptera, to ten sam kod ... uu – Jonatan

+0

Jaki jest problem, jakie było oczekiwane zachowanie i co się stało? –

Odpowiedz

11

swoje kod jest nieco mylący, dlatego podam próbkę

Próbka Tag klasa

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

} 

chcesz uzyskać te wartości po kliknięciu w przycisk prawej? Więc umieścić ten obiekt klasy tag jako tag przycisk w getView z niestandardowego adaptera

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

skoro masz widok kliknął jako argument do swojej funkcji

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

myślę masz pomysł, spróbuj Aby zaimplementować swój kod z tym pomysłem

+0

OK, spróbuję tego, jestem pewien, że czegoś brakuje, może potrzebuję przerwy, dziękuję – Jonatan

+0

@Shereef dziękuję, widziałem mój błąd, powinienem użyć setTag po tej linii "holder.code.setText (storeItem.getCode())" .. używając "holder.share.setTag (storeItem.getCode())", to jest ogólna odpowiedź thak you !! : D – Jonatan

4

Jesteś bardzo blisko swojej odpowiedzi.Wystarczy śledzić zmiany i uzupełnienia odpowiedź

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

@ Biraj Ok, więc jeśli dodać te zmiany na moim niestandardowym adapterze, jaki jest kod za pomocą getTag w moim "publicznym void shareOnClickHandler (View v)", aby uzyskać na przykład tekst z mojego widoku tekstowego? ty – Jonatan

+0

Niedopuszczenie brwi jest bardziej precyzyjne. –

+0

@ Biraj - Ok .. Mam listview, który używa niestandardowego adaptera z 3 widokami: Textview, Webview i Button, więc kiedy używam SetAdapter firstime na Main Activity, ładuję mój listview z widokami (webview, textview i button) to jest ok..continue – Jonatan

1

Odpowiedź 1:

Co chcesz zrobić:

nad lub tuż po tej linii: holder.code.setText(storeItem.getCode()); dodać następujące: holder.share.setTag(storeItem.getCode());

oraz w 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 
} 

Albo

Odpowiedź 2:

Może nie trzeba używać setTag i getTag jeśli wykonaj następujące czynności

  1. Idź do xml i usunąć atrybut onclick z przycisku my użyje go w Javie zamiast:
  2. Użyj poniższego getView

    @Override public Zobacz getView (pozycja int, 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; 
    } 
    
+0

OK I "Spróbuję, naprawdę doceniam twój czas, nie mogę tego teraz przetestować, bo mój serwis internetowy jest wyłączony = (, kiedy działa, przetestuję go i sprawdzę jak odpowiedź dziękuję! – Jonatan

+0

Nie spiesz się :) –

Powiązane problemy