2017-02-12 9 views
0

CustomAddapter-ArrayListを使用して、GridViewのカードを構築しています。 すべてのセルには2つのimageViewが含まれています(カードの前面または背面に1つしか表示されません)。 「フリッピング」はアニメーションを使用しています。 コードは正常に動作します。アニメーションで反転しない唯一のセルは、位置0のセルです(image1はimage2に変更されますが、アニメーションは変更されません)。すべてのGridViewが「位置0」を2回呼び出しています

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 

をクリックするため は、それから私は、私はこのウェブサイト上の答えを見つけることを試みたが、彼らは、レイアウトの高さについて話し続け、それがなかったの 位置0は、getViewメソッドに2回呼び出され、その理由であるかもしれない何かに気づきました助けてください。 私を助けてもらえますか?

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のリンクをチェックしてください - あなただけの賭けは、フリップアクションのキューを保持するだろう(ただ、設定されたデータ構造や何かを選んだ)とonClickでそれを埋める

Multiple calling of getView() in GridViewと次にgetViewのパスで、このキューの内容を確認し、必要に応じて反転を処理します。処理されたら、そのエントリをキューから削除します。これは、あなたが2回フリップアップしないようにするためです。原因Gridviewの性質

は(特別に、それの境界についてwrap_content属性を持つチャイルズで)、それはあまりにもgetViewに非冪等のコードを維持する危険な種類です。

残念ながら、私は正確な問題に直面して同じことを学んだが、ExpandableListViewであったにもかかわらず。

+0

私の場合、キューは役に立ちません。私のカードは2回フリップしません。最初のコールをフリップするのに十分な時間がないと思います。すでに2回目のコールにジャンプしています。それは、カードがフリップされたままの状態にジャンプすることを意味します。 "else(getItem .selected == 2 "私は推測している条件で遊んでいなければなりませんが、間違っていると感じます。 – SHAI

関連する問題