2017-02-12 7 views
0

Я создаю GridView карт, используя CustomAddapter-ArrayList. Каждая ячейка содержит 2 изображения (только один вид на каждый щелчок или на обратной стороне карты). Для «переворачивания» я использую анимацию. Код работает нормально, единственная ячейка, которая не будет переворачиваться с анимацией, - это ячейка с позицией 0 (изображение1 изменится на изображение2, но без анимации). Потом я заметил, что-то, что может быть причиной этого, позиция 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 (position) .selected == 2 «Я должен продолжать играть с условиями, которые, я думаю, но я чувствую, что это неправильно. Где еще я должен создать анимацию, если не в адаптере? – SHAI

 Смежные вопросы

  • Нет связанных вопросов^_^