2014-05-01 15 views
5

Ich verwende StickyGridHeaders Bibliothek, um eine Gridview wie snapfish zu erstellen. Hier ist mein erwartetes Layout:Popup-Fenster in StickyGridHeader falsche Position anzeigen

enter image description here

ich ein Popup-Fenster angezeigt, wenn eine Taste auf Kopfansicht (roter Pfeil) anstelle von Kontrollkästchen zu berühren. Das Problem ist, dass mein Popup-Fenster immer die falsche Position anzeigt. Von Fenstern Debuggen kann ich es hat die gleiche Stelle mit klebrigem Kopf, aber ich für meine Gridview mithilfe von StickyGridHeadersGridView.setAreHeadersSticky(false);

Hier ausgeschaltet sticky Kopf sieht, ist meine Adapter-Header:

public View getHeaderView(final int position, View convertView, ViewGroup parent) { 
      final HeaderViewHolder viewHolder; 
      if(convertView == null){ 
       convertView = inflater.inflate(R.layout.item_header_gallery, null); 
       viewHolder = new HeaderViewHolder(); 
       viewHolder.tvImagePrice = (TextView) convertView.findViewById(R.id.tvImagePrice); 
       viewHolder.btnTouch = (Button) convertView.findViewById(R.id.btnTouch); 
       convertView.setTag(viewHolder); 
      }else{ 
       viewHolder = (HeaderViewHolder) convertView.getTag();  
      } 

      ImageGroup item = headers.get(position);  
      viewHolder.tvImagePrice.setText(item.getPriceString()); 

      viewHolder.btnTouch.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        int[] location  = new int[2]; 

        viewHolder.btnTouch.getLocationOnScreen(location); 
        // location always is [905,59] for every header item 
        System.out.println("location = " + location[0] + "," + location[1]); 

        // show popup on this location: 
        mPopupWindow.showAtLocation(v, Gravity.NO_GRAVITY, location[0], location[1]); 
       } 
      }); 

      return convertView; 
     } 

Wenn ich zeige Ein Popup in der Unteransicht statt der Kopfzeile, das Popup-Fenster wird korrekt angezeigt. Ist etwas nicht in Ordnung?

+0

Wenn Sie dies noch nicht gelöst haben ... versuchen Sie, den Ort aus der 'View' zu holen, auf die geklickt wurde:' v.getLocationOnScreen (location); 'anstelle der Instanz von' viewHolder'. – myanimal

+0

Ich habe versucht, aber es zeigt immer noch auf der Oberseite von Gridview. Weil diese Bibliothek versucht, die Header-Ansicht oben durch Anfügen und Trennen der Ansicht – R4j

Antwort

0

Sehen Sie wie es keine Möglichkeit gibt Kopfanzeigeposition korrekt zu erhalten, da diese Bibliothek verwendet anhängen und Kopfansicht in StickyGridHeadersBaseAdapterWrapper

HeaderFillerView v = getHeaderFillerView(adapterPosition.mHeader, convertView, parent); 
View view = mDelegate.getHeaderView(adapterPosition.mHeader, (View)v.getTag(), parent); 
mGridView.detachHeader((View) v.getTag()); 
v.setTag(view); 
mGridView.attachHeader(view); 
convertView = v; 
mLastHeaderViewSeen = v; 
v.forceLayout(); 

Eigentlich lösen, es genannt dispatchAttachedToWindow und dispatchDetachedFromWindow Sichtklasse durch Reflexion. Und es verursachte falsche Fenster auf dem gesamten Bildschirm, wie nosacky sagte.
Jetzt bin ich quit und ersetze diese StickyGridHeaders durch Listview mit Header-Element und Gridview Element. Dies ist nicht der beste Weg, aber es kann funktionieren.

1

Sieht so aus, als ob Sie die Fensterposition innerhalb des anderen Fensters erhalten und nicht die Position auf dem gesamten Bildschirm. Schauen Sie sich auf diese Frage für weitere Informationen: getLocationOnScreen() vs getLocationInWindow()

+0

Ich weiß, was Sie meinen, aber wie kann ich dieses Problem lösen? – R4j

Verwandte Themen