2014-05-12 12 views
5

Wdrażam BaseAdapter i używam TłumaczAnimacji dla pojedynczego elementu listy.Przywróć przesunięcie x elementu listy do wyświetlenia

Problem polega na tym, że podczas przewijania w dół inne widoki mają takie samo przesunięcie.

Oto moja wdrożenie metody getView():

 @Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder viewHolder; 
    if (convertView == null) { 
      //initialization code 
      convertView.setTag(viewHolder); 
    } else { 
     viewHolder =(ViewHolder) convertView.getTag(); 
    } 

     Animation animation; 
     switch (item.getAnimationDirection()) { 
     case AnimationDirection.HIDE: 
      animation = new TranslateAnimation(itemOffset, 0, 0, 0); 
      animation.setDuration(200); 
      animation.setFillAfter(true); 
      viewHolder.layoutToAnimate.setAnimation(animation); 
      item.setAnimationDirection(AnimationDirection.HIDDEN); 
      break; 
     case AnimationDirection.REVEAL: 
      itemOffset = viewHolder.remove.getWidth() + 20; 
      animation = new TranslateAnimation(0, itemOffset, 0, 0); 
      animation.setDuration(200); 
      animation.setFillAfter(true); 
      viewHolder.layoutToAnimate.setAnimation(animation); 
      item.setAnimationDirection(AnimationDirection.SHOWING); 
      break; 
     } 

     viewHolder.remove.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if (item.getAnimationDirection() == AnimationDirection.HIDDEN) { 
        item.setAnimationDirection(AnimationDirection.REVEAL); 
        notifyDataSetChanged(); 
       } 
      } 
     }); 
     convertView.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if (item.getAnimationDirection() == AnimationDirection.SHOWING) { 
        item.setAnimationDirection(AnimationDirection.HIDE); 
        notifyDataSetChanged(); 
       } 
      } 
     }); 
     return convertView; 
    } 

Moje pytanie brzmi::

Jak mogę utrzymać ten stan View offsetu dla każdego ListView sprzęcie?

Odpowiedz

1

Do tego celu należy użyć Map<Integer, Integer>. Coś jak

map.put(position, offset); 

i

int offset = map.get(position); 

Nie zapomnij ustawić to każdym razem wykonana jest wywołanie getView.

+0

gdzie należy przechowywać przesunięcie widoku? zaraz po uruchomieniu animacji? – user1940676

+0

Ilekroć zmienia się dla określonej pozycji. Możesz użyć 'AnimatorUpdateListener'. – nhaarman

+0

i jak mogę przywrócić przesunięcie? kiedy wywołuję setX() wewnątrz adaptera, wydaje się, że nie działa, mam na myśli, czy jest sposób na osiągnięcie tego w adapterze bez użycia niestandardowej implementacji listview? – user1940676

4

Architektura systemu Android udostępnia funkcję przechwytywania w celu zachowania i przywracania właściwości widoku, więc należy się upewnić, że kod widoku implementuje onSaveInstanceState() i onRestoreInstanceState(Parcelable state), a po wywołaniu wywołuje to samo dla widoków podrzędnych i wywołuje klasę nadrzędną. metody np super.onSaveInstanceState().

Wysłałem odpowiedź here, która w odpowiedzi na pytanie dotyczące zachowania danych używanych w widoku listy, ale także omawia sposób zachowania innych właściwości widoku, takich jak przewijanie pozycji w komentarzach.

+0

Mogę zapisać offset dla każdej pozycji, ale jak ustawić przesunięcie wewnątrz metody getView()? – user1940676

+0

Nie trzeba ustawiać przesunięcia. Klasa rodzica twojego widoku zrobi to po wywołaniu 'onRestoreInstanceState'. Jeśli chcesz wyraźnie ustawić początkową pozycję poziomą, widok musi być podklasą (lub wewnątrz) widoku, który obsługuje przewijanie w poziomie - na którym programowo można ustawić pozycję przewijania - patrz http://developer.android.com /reference/android/widget/HorizontalScrollView.html – Phil

0

Wystąpił podobny problem, ale mój był w kolorach i miał 2 listview umieszczone obok siebie. Zmieniłem kolor czerwony na pozycję na liście, która została dotknięta na tej samej pozycji na innej liście. Poprawny wpis został podświetlony, ale inna pozycja na liście była również na arbitralnej pozycji. Sposób, w jaki to rozwiązałem, to użycie instrukcji if-else (której używałem tylko wtedy, gdy wcześniej). Mój kod w getview() jest taki:

if(position == highLightPosition){ 
holder.layout.setBackgroundColor(getResources().getColor(R.color.high_red)); 
}else{ 
//I set default color here that solved my problem 
holder.layout.setBackgroundColor(getResources().getColor(R.color.white)); 
} 

Spróbuj czegoś takiego Wiem, że przełącznik i jeśli wygląda tak samo, ale to działało dla mnie.

Powiązane problemy