2017-02-12 5 views
0

Ich baue eine GridView von Karten, mit CustomAddapter-ArrayList. Jede Zelle enthält 2 imageViews (nur eins ist pro Klick sichtbar - Vorder- oder Rückseite einer Karte). Zum "Spiegeln" verwende ich Animation. Der Code funktioniert gut, die einzige Zelle, die nicht mit Animation kippen wird, ist die Zelle mit der Position 0 (Bild1 wird zu Bild2, aber keine Animation). Dann bemerkte ich etwas, das der Grund dafür sein könnte, 0 Position zweimal in getView für jeden aufgerufen klickenGridView ruft zweimal "Position 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 

Ich habe versucht, Antworten auf dieser Website zu finden, aber sie hielten über die Layouthöhe zu reden und es didn Hilf mir nicht. Können Sie mir bitte helfen?

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

Aktivität Layout:

<?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> 

Reihe 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" 
/> 

Antwort

0

Dies ist ein sehr altes Verhalten, überprüfen Sie diese SO Link - Multiple calling of getView() in GridView

Ihre einzige Wette eine Warteschlange von Flip-Aktionen zu behalten wäre (nur eine Satz Datenstruktur oder etwas gewählt hat) und es in onClick füllen und Überprüfen Sie dann in der nächsten getView Prüfung den Inhalt dieser Warteschlange und bearbeiten Sie ggf. das Spiegeln. Nach der Bearbeitung entfernen Sie diesen Eintrag aus Ihrer Warteschlange. Dies ist nur um sicherzustellen, dass Sie nicht zweimal umkehren.

Aufgrund der Natur von Gridview (speziell mit childs, die ein wrap_content-Attribut für seine Grenzen hat), ist es Arten riskant zu halten nicht-idempotenten Code in getView.

Leider habe ich das gleiche gelernt, indem ich das genaue Problem, aber mit einer ExpandableListView konfrontiert.

+0

Die Warteschlange wird in meinem Fall nicht helfen. Meine Karte klappt nicht zweimal, ich denke, sie hat nicht genug Zeit, um den ersten Anruf umzulegen - sie springt bereits zum zweiten Anruf - und das bedeutet, dass sie zu der zweiten Bedingung springt, die die Karte umgedreht hält - "else (getItem (Position) .selected == 2 ". Ich sollte weiterhin mit Bedingungen spielen, die ich vermute, aber ich fühle mich falsch. Wo sollte ich die Animation sonst noch erstellen, wenn nicht im Adapter? – SHAI

Verwandte Themen