2014-05-12 17 views
11

Tôi bị kẹt và tôi cần trợ giúp. Tôi đang cố gắng sử dụng thiết lập và nhận được Tag nhưng tôi không thể có được cách thức hoạt động cho hành động này:Cách sử dụng setTag và getTag với bộ điều hợp tùy chỉnh

  • Tôi đang sử dụng xem danh sách để hiển thị hình ảnh nạp vào bộ chuyển đổi mở rộng
  • Các Adaptor tùy chỉnh thổi phồng một bố trí với imageview_1, textview_1 và button_1
  • Trên hoạt động chính của tôi, tôi có "Công khai Void OnClickHandler" cho button_1 và được cấu hình trên bố cục với "android: onClick", vì vậy khi nút được nhấp vào, hãy làm điều gì đó
  • Khi button_1 được nhấp, tôi muốn nhận văn bản từ textview_1 từ chế độ xem cụ thể đó và sau đó tải một hình ảnh khác. Tôi muốn sử dụng tính năng này và đặt TAGS, vì vậy tôi cần thực hiện tham chiếu với button_1 và imageview_1. ở đây mã của tôi. Cảm ơn bạn trước

Các Adaptor tùy chỉnh

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

Đây là phương thức getter và setter của tôi cho dữ liệu, rất dễ dàng

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

Hoạt động chủ yếu của tôi 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

tại sao bạn không cần phải gọi bấm nghe của button_1 trong lớp bộ chuyển đổi? Nó quá dễ dàng thay vì sau đó phương pháp ur .... – dipali

+0

@dipali Bởi vì tôi phải làm những hành động phức tạp hơn trong nút đó , Tôi muốn biết cách sử dụng đúng các thẻ đó, nhưng tôi đoán nếu tôi sử dụng bộ điều hợp bên trong là cùng một mã .. uu – Jonatan

+0

Vấn đề là gì, hành vi mong đợi và những gì đã xảy ra thay vào đó? –

Trả lời

11

của bạn mã hơi khó hiểu, vì vậy tôi cung cấp cho bạn một mẫu

Sample Tag lớp

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

} 

bạn muốn nhận được các giá trị này khi nhấp vào nút bên phải? Vì vậy, đưa đối tượng thẻ lớp này như thẻ trên nút trong getView adapter tùy chỉnh của bạn

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

kể từ khi bạn có được cái nhìn nhấp như là đối số cho hàm của bạn

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

Tôi nghĩ rằng bạn sẽ có được ý tưởng, hãy thử để triển khai mã của bạn với ý tưởng này

+0

Ok Tôi sẽ thử nó, tôi chắc chắn rằng tôi đang thiếu điều gì đó, có thể tôi cần nghỉ ngơi, cảm ơn bạn – Jonatan

+0

@Shereef cảm ơn bạn, tôi đã thấy sai lầm của mình, tôi nên sử dụng setTag sau dòng này "holder.code.setText (storeItem.getCode())" .. sử dụng "holder.share.setTag (storeItem.getCode())", đây là câu trả lời chung của bạn! : D – Jonatan

4

Bạn rất gần với câu trả lời của mình.Chỉ cần làm theo những thay đổi và hoàn thành câu trả lời của bạn

@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, vì vậy nếu tôi thêm thay đổi này trên bộ điều hợp tùy chỉnh của tôi, mã bằng cách sử dụng getTag trên "public void shareOnClickHandler (View v)" của tôi để lấy ví dụ văn bản từ văn bản của tôi là gì? ty – Jonatan

+0

Không nhận được lời cầu xin của chúng tôi chính xác hơn. –

+0

@ Biraj - Ok .. Tôi có một listview đó là sử dụng một adapter tùy chỉnh với 3 lần xem: Textview, Webview và Button, vì vậy khi tôi sử dụng SetAdapter firstime trên Main Activity tôi tải listview của tôi với các quan điểm (webview, textview và nút) đó là ok..continue – Jonatan

1

Trả lời 1:

Những gì bạn muốn làm điều đó:

trên hoặc ngay sau khi dòng này: holder.code.setText(storeItem.getCode()); thêm như sau: holder.share.setTag(storeItem.getCode());

và trong 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 
} 

Hoặc

Trả lời 2:

Bạn có thể không cần sử dụng setTaggetTag nếu bạn thực hiện như sau

  1. Tới xml của bạn và loại bỏ các thuộc tính onclick từ nút chúng tôi sẽ sử dụng nó trong Java thay vì
  2. Sử dụng getView sau đây

    @Override công khai Xem getView (vị trí int, Xem convertView, ViewGroup cha mẹ) { 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 tôi sẽ thử nó, tôi thực sự đánh giá cao thời gian của bạn, tôi không thể kiểm tra ngay bây giờ 'vì webservice của tôi là xuống = (, khi nó đang làm việc tôi sẽ kiểm tra nó và kiểm tra nó như câu trả lời cảm ơn bạn! – Jonatan

+0

Hãy dành thời gian của bạn :) –

Các vấn đề liên quan