2012-08-23 84 views
0

我正在處理需要顯示項目的動態列表的佈局。每個項目都有一個定義的UUID,一個名稱(橫幅文本),一個圖像URL和一個布爾值來表明它是否被選中 - 我還創建了一個POJO來保存這些。我創建了一個自定義佈局,將項目放在網格視圖中,其中包含橫幅文本的兩個圖標。它看起來像這樣:GridView與CustomLayout項目和狀態

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 
    <RelativeLayout 
    android:id="@+id/ItemLayout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
    <ImageView 
     android:id="@+id/ItemImage" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_alignParentTop="true" 
     android:background="@android:color/transparent" /> 
    <ImageView 
     android:id="@+id/ItemOverlayImage" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_alignParentTop="true" 
     android:background="@android:color/transparent" /> 
    <TextView 
     android:id="@+id/ItemTextBanner" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="2dp" 
     android:background="#BF000000" 
     android:gravity="center" 
     android:textStyle="bold" /> 
    </RelativeLayout> 
</FrameLayout> 

我已經創建自定義適配器和活動,以及和我有沒有問題,讓所有的物品讀取,圖像的下載,編碼,位圖和文字橫幅被設置。問題是我想要「選擇」狀態和圖像改變,如果該項目被點擊。

我知道我可以添加GridView.setOnItemOnClickListener並在裏面我知道哪個項目被選中以及父視圖來自哪裏,但我不知道如何獲取它的「選定」狀態。 This鏈接使用適配器中的靜態列表的狀態,這是我所建模的。我添加了以下方法並從GridView.setOnItemOnClickListener調用它。

public void itemSelected(View parent, int position) 
{ 
    if(items.get(position).isSelected()) 
    { 
     ImageView interestSelected = (ImageView)parent.findViewById(R.id.ItemOverlayImage); 
     interestSelected.setImageResource(0); 
    } 
    else 
    { 
     ImageView interestSelected = (ImageView)parent.findViewById(R.id.ItemOverlayImage); 
     interestSelected.setImageResource(R.drawable.overlay);   
    } 
} 

第一個問題很明顯,我沒有將狀態保存到我的items數組中,但這是一個簡單的修復。真正的問題只是第一個獲得重疊的項目。那麼我該如何修改GridView中的項目R.id.ItemOverlayImage而不僅僅是第一個?或者我是否完全錯誤?

回答

1

只是一些關於你的代碼點:

你可能只得到與覆蓋的第一個項目,因爲你findViewById父搜索,在GridView而不是排視圖view,所以findViewById將返回找到它的第一個ImageView(位於第一個可見行)。爲了顯示疊加層,您可以根據您在適配器的getView方法中使用的代碼來選擇是否顯示一個項目,例如,當您單擊某個項目時只顯示一個疊加項目(例如,當您單擊某個項目時,前一個被點擊的(如果有的話)將取消選擇),或者如果您有選項切換項目(點擊 - >覆蓋,另一個點擊 - >沒有覆蓋)。如果不知道這上面的信息是我會怎麼做:

public void onItemClick (AdapterView<?> parent, View view, int position, long id) { 
    ImageView overlay = (ImageView) view.findViewById(R.id.ItemOverlayImage); 
    if (!items.get(position).isSelected()) { // the item doesn't have an overlay 
     overlay.setImageResource(R.drawable.overlay); // set the overlay 
     items.setSelected(true); // set to true so the adapter knows it 
    } else { // the item has the overlay so we remove it 
     overlay.setImageResource(0); 
     items.setSelected(false); set to false so the adapter knows it 
    } 
} 

只要你在getView方法isSelected設置或不設置你會沒事的疊加使用。

此外,您應該刪除包裝RelativeLayoutFrameLayout,因爲您無需執行任何操作(?!?)。

+0

謝謝,只要我開始使用視圖,而不是父母它工作得很好。我也刪除了FrameLayout,覆蓋看起來也是如此。我認爲FrameLayout將有必要將圖像疊加在一起。 –

+0

@Luksprog嘿你能幫我嗎。我想單擊圖像視圖的事件並拖動網格項的按鈕。但不知道如何? –