2017-02-12 54 views
0

我正在使用CustomAddapter-ArrayList構建卡片的GridView。 每個單元格都包含2個imageViews(每個單擊卡片或卡片的背面只能看到一個)。 對於「翻轉」我使用動畫。 代碼工作正常,唯一不會隨動畫翻轉的單元格是位置爲0的單元格(image1將更改爲image2,但不包含動畫)。 然後我注意到的東西,可能是它的原因, 位置0 getView調用兩次每次點擊GridView正在調用「位置0」兩次

I/System.out: position: 0 
I/System.out: position: 0 
I/System.out: position: 1 
I/System.out: position: 2 
I/System.out: position: 3 
... // up to 20 

我試圖找到這個網站上的答案,但他們一直在談論佈局的高度,它沒沒有幫助。 你能幫我嗎?

CustomAdapter:

public class CustomAdapter extends ArrayAdapter<Square> { 

final AnimatorSet setRightOut; 
final AnimatorSet setLeftIn; 

public CustomAdapter(GameActivity context, ArrayList<Square> list) { 
    super(context, 0, list); 

    setRightOut = (AnimatorSet) AnimatorInflater.loadAnimator(context, 
      R.animator.flip_right_out); 
    setLeftIn = (AnimatorSet) AnimatorInflater.loadAnimator(context, 
      R.animator.flight_left_in); 
} 

class ViewHolder { 
    public ImageView img1,img2; //img1=card's back, img2=card's front (random pic) 
} 

public View getView (int position, View convertView, ViewGroup parent){ 

    ViewHolder viewHolder; 
    if (convertView == null) 
    { 
    convertView= LayoutInflater.from(getContext()).inflate(R.layout.row, null); 
    viewHolder=new ViewHolder(); 
    viewHolder.img1 = (ImageView) 
    convertView.findViewById(R.id.imageView); 
    viewHolder.img2 = (ImageView) convertView.findViewById(R.id.imageView2); 
    convertView.setTag(viewHolder);//setting random pic} 

    else{viewHolder= (ViewHolder) convertView.getTag();} 

    System.out.println("position: " + position); 
    viewHolder.img2.setImageResource(getItem(position).id); 

     if (getItem(position).selected == 1) { //first flip 

      setRightOut.setTarget(viewHolder.img1); 
      setLeftIn.setTarget(viewHolder.img2); 
      setRightOut.start(); 
      setLeftIn.start(); 
      getItem(position).selected = 2; } 

     else (getItem(position).selected == 2) //card was flipped already- stay flipped 
      { 
      viewHolder.img2.setAlpha(1.0f); 
      viewHolder.img1.setAlpha(0.0f); 
      } 

    return convertView; 
}} 

活動佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:orientation="vertical" 
android:id="@+id/activity_game" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:background="#0f49b4" 
tools:context="com.example.memory.GameActivity"> 


<GridView 
    android:layout_width="match_parent" 
    android:layout_height="410dp" 
    android:numColumns="4" 
    android:background="#d5e2e1" 
    android:id="@+id/gridView" 
</GridView> 

</LinearLayout> 

行XML:

?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" android:layout_width="100dp" 
android:layout_height="80dp"> 

<ImageView 
    android:layout_width="100dp" 
    android:layout_height="80dp" 
    android:id="@+id/imageView" 
    android:src="@drawable/q"/> 

<ImageView 
    android:layout_width="100dp" 
    android:layout_height="80dp" 
    android:id="@+id/imageView2" 
    android:alpha="0" 
/> 

回答

0

這是一個非常古老的問題,檢查該SO鏈接 - Multiple calling of getView() in GridView

你唯一的選擇是將保留翻轉動作的隊列(只是選擇了一組數據結構或東西),並在onClick填滿它和然後在下一個getView通過,檢查此隊列的內容並處理翻轉(如果需要)。處理完成後,從隊列中刪除該條目。這只是爲了確保你不會最終翻動兩次。

由於Gridview(特別是具有wrap_content屬性的小孩)的性質,這種風險也會在getView中保留非冪等代碼。

不幸的是,我面臨的確切問題,但儘管與ExpandableListView瞭解相同。

+0

隊列在我的情況下不會有幫助。我的卡沒有翻轉兩次,我猜它沒有足夠的時間翻轉第一個電話 - 它已經跳到第二個電話 - 這意味着它會跳轉到第二個條件,使卡翻轉 - 「else(getItem(位置).selected == 2「。我應該繼續玩我想的條件,但我覺得它是錯誤的。如果不在適配器中,我應該在哪裏創建動畫? – SHAI