2013-12-16 71 views
0

我一直在努力解決這個問題兩天,並沒有發現任何有用的在線。 我的設置是這樣的,我有一個Gridview,我用API填充圖像。現在GridView的每個單元格都包含一個按鈕,點擊時應該爲該單元格添加一個疊加層。這是通過webservice根據值動態完成的。現在的問題是,當我向上或向下滾動添加到其他單元格的疊加層時,我該如何解決這個問題?通過適配器保存動態添加視圖的狀態

我已經試過什麼:

我已經試過這是通過使用保存位置保存複選框的狀態SparseBooleanArray解決方案,但因爲我有保持掙扎這種方法不能解決問題視圖的狀態完好無損。

我懷疑什麼:

的代碼通過一個被稱爲按鈕的點擊方法增加覆蓋。我使用點擊位置通過gridView.getChildat(position)獲取單元格,並將疊加層作爲子元素添加到它。我認爲我的convertView沒有更新,這就是爲什麼覆蓋層繼續繪製不同的單元格位置。

相關代碼:

這是我getView方法中,

if (convertView == null) { 
     convertView = inflater.inflate(R.layout.grid_image_row, null); 
     holder = new Holder(); 
     holder.iv_product_image = (ImageView) convertView.findViewById(R.id.id_iv_product_image) ; 
     RelativeLayout.LayoutParams iv_product_image_params = new RelativeLayout.LayoutParams(imageWidth,imageHeight) ; 
     holder.iv_product_image.setLayoutParams(iv_product_image_params) ; 
     iv_product_image_params = null ; 
     holder.iv_loader_image = (ImageView) convertView.findViewById(R.id.id_iv_loader_image) ; 
     holder.bt_expand_save_overlay = (CheckBox) convertView.findViewById(R.id.id_bt_expand_save_overlay) ; 
     holder.tv_productname = (TextView) convertView.findViewById(R.id.id_tv_productname) ; 
     customFonts.SetSoureLightFont(holder.tv_productname) ; 
     holder.tv_sellingprice = (TextView) convertView.findViewById(R.id.id_tv_sellingprice) ; 
     customFonts.SetSoureLightFont(holder.tv_sellingprice) ; 
     holder.tv_price = (TextView) convertView.findViewById(R.id.id_tv_price) ; 
     customFonts.SetSoureRegularFont(holder.tv_price) ; 
     holder.parent_cell = null; 
     convertView.setTag(holder); 
} else { 
     holder = (Holder) convertView.getTag(); 
} 

編輯:這是我如何設置標籤與位置...

    if (session.isLoggedIn()) { 
        holder.bt_expand_save_overlay.setTag("1,"+position) ; 
        int i=0; 
        for (i=0; i<savedItemsHashMap.size(); i++) { 
        HashMap<String,String> savedItems = new HashMap<String, String>() ; 
       savedItems = savedItemsHashMap.get(i) ; 
if (savedItems.get(GlobalVariables.KEY_PRODUCT_ID).equals(mapStr.get(GlobalVariables.KEY_ID))) { 
           holder.bt_expand_save_overlay.setButtonDrawable(R.drawable.wishlist_saved_drawable) ; 
           break ; 
          } 
         } 

         if (i==savedItemsHashMap.size()) { 
          holder.bt_expand_save_overlay.setButtonDrawable(R.drawable.wishlist_unsaved_drawable) ;  
         } 
        } else { 
        holder.bt_expand_save_overlay.setTag("0,"+position) ; 
        } 

這是怎麼了我綁定點擊監聽器裏面的getView,我保存在標籤中的位置。

holder.bt_expand_save_overlay.setOnClickListener(new View.OnClickListener() { 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    String getTagString = (String)v.getTag() ; 
    String [] items = getTagString.split(","); 
    selectedExpandButton = Integer.valueOf(items[1]) ; 
    ExpandSaveForLaterOverlay (selectedExpandButton) ; 
} 

的ExpandSaveForLaterOverlay添加視圖到選定單元格,但滾動的時候,這並不停留在同一個孩子。

在此先感謝您的幫助或提示!

更新:我檢查了谷歌播放音樂應用程序,他們有相同的設置。他們有一個按鈕的gridview,顯示一個菜單覆蓋點擊。但是在滾動菜單之前,它不可見,只有在它滾動之後。有沒有辦法在視圖實例本身保存覆蓋?

+0

你是否爲所有項目添加了相同的疊加層? – keshav

+0

ExpandSaveForLaterOverlay類根據項目的ID添加兩種或三種佈局。儘管如此,如果佈局相同,那麼同樣的問題仍然存在。 –

回答

0

好吧,最後我對android架構的想法是錯誤的。我需要的是將添加的佈局顯示爲下拉菜單。並且當gridview被滾動時,應該滾動添加的佈局。這在任何可用的android sdk中都是不可能的。我可能不得不對這樣的實現做出自己的看法,這些實現將跟蹤添加的疊加層的虛擬y和x位置。

0

嘗試在適配器上的ImageView使用setTag()之類

holder.imageView.setTag(position); 

而當你添加的覆蓋作爲一個孩子喜歡

holder.imageView.getTag(); 

再加入覆蓋getTag()。

+0

嗨keshav感謝您的答案,但我相信我也這樣做,如果你看看我的點擊監聽器,我與getView中的視圖綁定,我只通過標籤獲取位置。當我滾動我的gridView時,問題就出現了,添加的覆蓋圖在不同的單元格上可見,而不是我最初添加的單元格。 –

+0

我不是在談論convertta的settag(),而是爲了在代碼中添加覆蓋圖的imageview,而是爲整個視圖設置標記,這是不同的。 – keshav

+0

我以某種方式刪除了代碼,但現在可以再次檢查問題,我已經更新了它。我將位置設置爲標記到我在ExpandSaveForLaterOverlay函數中提取它的bt_expand_save_overlay。因此,我僅通過位置獲取視圖,然後將其作爲孩子添加到視圖中。這種方法只有在我滾動的時候才能正常工作。滾動gridview後,展開的覆蓋圖隨機顯示。 –

相關問題