Android GridView正在调用;位置0“;两次

Android GridView正在调用;位置0“;两次,android,gridview,baseadapter,custom-adapter,Android,Gridview,Baseadapter,Custom Adapter,我正在使用CustomAddapter ArrayList构建一个卡片的GridView。 每个单元格包含2个ImageView(每次单击卡的正面或背面时,只能看到一个)。 对于“翻转”,我使用动画。 代码工作正常,唯一不会随动画翻转的单元格是位置为0的单元格(image1将更改为image2,但没有动画)。 然后我注意到一些可能是原因, 在getView中,每次单击都会调用两次位置0 I/System.out: position: 0 I/System.out: position: 0 I/S

我正在使用CustomAddapter ArrayList构建一个卡片的GridView。 每个单元格包含2个ImageView(每次单击卡的正面或背面时,只能看到一个)。 对于“翻转”,我使用动画。 代码工作正常,唯一不会随动画翻转的单元格是位置为0的单元格(image1将更改为image2,但没有动画)。 然后我注意到一些可能是原因, 在getView中,每次单击都会调用两次位置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扩展了ArrayAdapter{
最终动画集setRightOut;
最终动画集setLeftIn;
公共CustomAdapter(游戏活动上下文,ArrayList列表){
超级(上下文,0,列表);
setRightOut=(AnimatorSet)AnimatorInflater.loadAnimator(上下文,
R.动画师。向右翻转);
setLeftIn=(AnimatorSet)AnimatorInflater.loadAnimator(上下文,
R.动画师。飞行(左进);
}
类视图持有者{
公共图像视图img1,img2;//img1=卡片背面,img2=卡片正面(随机图片)
}
公共视图getView(int位置、视图转换视图、视图组父视图){
持票人持票人;
if(convertView==null)
{
convertView=LayoutInflater.from(getContext()).flate(R.layout.row,null);
viewHolder=新的viewHolder();
viewHolder.img1=(图像视图)
findviewbyd(R.id.imageView);
viewHolder.img2=(ImageView)convertView.findViewById(R.id.imageView2);
convertView.setTag(viewHolder);//设置随机图片}
else{viewHolder=(viewHolder)convertView.getTag();}
系统输出打印项次(“位置:+位置);
viewHolder.img2.setImageResource(getItem(position).id);
如果(getItem(position).selected==1){//第一次翻转
setRightOut.setTarget(viewHolder.img1);
setLeftIn.setTarget(viewHolder.img2);
setRightOut.start();
setLeftIn.start();
getItem(position).selected=2;}
else(getItem(position).selected==2)//卡片已翻转-保持翻转状态
{
viewHolder.img2.setAlpha(1.0f);
viewHolder.img1.setAlpha(0.0f);
}
返回视图;
}}
活动布局:



这是一个非常古老的行为,请检查此SO链接-

您唯一的赌注是保留一个翻转操作队列(只需选择一个设置的数据结构或其他内容),并将其填充到
onClick
中,然后在下一个
getView
过程中,检查此队列的内容并在需要时处理翻转。处理后,从队列中删除该条目。这只是为了确保你不会翻两次

由于
Gridview
的性质(特别是对于具有wrap\u content属性的childs),在
getView
中保留非幂等代码也很危险


不幸的是,我通过面对确切的问题也学到了同样的道理,但尽管使用了
ExpandableListView

队列对我的情况没有帮助。我的卡没有翻动两次,我想它没有足够的时间翻动第一次调用-它已经跳到第二次调用-这意味着它将跳到第二个条件,使卡保持翻动-“else(getItem(position)。selected==2”.我想我应该继续使用条件,但我觉得不对。如果不是在适配器中,我还应该在哪里创建动画?
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 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"
 />