2017-02-12 22 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