2014-05-01 14 views
5

Tôi sử dụng thư viện StickyGridHeaders để tạo GridView như snapfish. Dưới đây là cách bố trí dự kiến ​​của tôi:Cửa sổ bật lên trong StickyGridHeader hiển thị sai vị trí

enter image description here

tôi hiển thị một cửa sổ popup khi chạm vào một nút trên cái nhìn tiêu đề (mũi tên màu đỏ) thay vì hộp kiểm. Vấn đề là cửa sổ popup của tôi luôn hiển thị vị trí sai. Từ gỡ lỗi cửa sổ, tôi có thể nhìn thấy nó có cùng một vị trí với nếp tiêu đề, nhưng tôi tắt tiêu đề dính cho GridView của tôi bằng cách sử dụng StickyGridHeadersGridView.setAreHeadersSticky(false);

Đây là tiêu đề bộ chuyển đổi của tôi:

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

Nếu tôi hiển thị cửa sổ bật lên trong chế độ xem con thay vì tiêu đề, cửa sổ bật lên hiển thị chính xác. Có gì sai không?

+0

Nếu bạn chưa giải quyết vấn đề này ... hãy thử lấy vị trí từ 'Chế độ xem' đã được nhấp: 'v.getLocationOnScreen (vị trí);' thay vì cá thể từ 'viewHolder'. – myanimal

+0

Tôi đã thử nhưng vẫn hiển thị ở trên cùng của chế độ xem lưới. Bởi vì thư viện này đã cố gắng để xem các tiêu đề trên đầu trang bằng cách đính kèm và tách xem – R4j

Trả lời

0

Nhìn như không có cách nào để có được vị trí mục tiêu đề một cách chính xác, bởi vì thư viện này sử dụng đính kèm và tách xem tiêu đề trong 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(); 

Trên thực tế, nó được gọi là dispatchAttachedToWindowdispatchDetachedFromWindow lớp xem bằng phản ánh. Và nó gây ra nhận được cửa sổ sai trên toàn bộ màn hình như nosacky nói.
Bây giờ tôi bỏ và thay thế StickyGridHeaders này bằng Listview với mục Tiêu đề và mục Gridview. Đây không phải là cách tốt nhất nhưng nó có thể hoạt động.

1

Có vẻ như bạn đang nhận được vị trí cửa sổ bên trong cửa sổ khác chứ không phải vị trí trên toàn bộ màn hình. Hãy nhìn vào câu hỏi này để biết thêm chi tiết: getLocationOnScreen() vs getLocationInWindow()

+0

Tôi biết những gì bạn có ý nghĩa nhưng làm thế nào tôi có thể giải quyết vấn đề này? – R4j

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