14

Ho una ListView contenente una serie di note.Come applicare l'animazione di layout Android solo ai bambini sopra un determinato indice?

Attualmente utilizzo un'animazione di layout per far scorrere tutte le note dal lato quando l'elenco viene caricato per la prima volta; questo funziona perfettamente.

Tuttavia, sto cercando di capire come applicare un'animazione di layout solo per elencare gli elementi al di sotto di un certo punto. Supponiamo che elimini un elemento nell'elenco: vorrei che tutti gli elementi sotto di esso si spostassero nel vecchio punto della nota cancellata.

Ho provato a trovare un modo per personalizzare i ritardi di animazione o gli interpolatori per indice figlio ma non ho trovato nulla di appropriato per questa posizione. C'è un modo per farlo usando un'animazione di layout personalizzata (come l'estensione di LayoutAnimationController) o dovrei fare questo livello basso e animare ogni vista individualmente?

Qualche suggerimento?

+0

vorrei animare ogni vista bambino singolarmente. Il ciclo semplice per tutti i bambini al di sotto dell'elemento eliminato funzionerebbe. –

risposta

1

Crea la tua animazione e chiamala nell'elenco OnItemClickListener. Successivamente è possibile utilizzare l'adattatore notifyDataSetChanged per aggiornare il contenuto dell'elenco.

In questo esempio, ho creato un metodo chiamato removeListItem con riceve la riga che si desidera rimuovere e la posizione di tale riga nell'elenco di contenuto.

public class MainActivity extends ListActivity implements OnItemClickListener{ 

ArrayList<String> values; 
ArrayAdapter<String> adapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    values = generateMockData(50); 

    adapter = new ArrayAdapter<String>(
      this, android.R.layout.simple_list_item_1, values); 

    setContentView(R.layout.activity_main); 

    getListView().setAdapter(adapter); 
    getListView().setOnItemClickListener(this); 
} 

private ArrayList<String> generateMockData(int number) { 

    ArrayList<String> result = new ArrayList<String>(); 

    for(int i = 0; i < number; i++) 
     result.add(""+i+" "+ (int)Math.random() * 13); 

    return result; 
} 

private void removeListItem(View rowView, final int positon) { 

    Animation anim = AnimationUtils.loadAnimation(this, 
      android.R.anim.slide_out_right); 
    anim.setDuration(500); 
    rowView.startAnimation(anim); 

    new Handler().postDelayed(new Runnable() { 

     public void run() { 

      values.remove(positon);//remove the current content from the array 

      adapter.notifyDataSetChanged();//refresh you list 

     } 

    }, anim.getDuration()); 

} 

public void onItemClick(AdapterView<?> arg0, View row, int position, long arg3) { 

     if(position == YOUR_INDEX) //apply your conditions here! 
      removeListItem(row,position); 
} 
1

ho avuto un problema molto simile ed è stato in grado di trovare una soluzione con un semplice View sottoclasse che consente di utilizzare un controller di layout di animazione per animare solo il punto di vista che si specificano. Si prega di consultare questo link:

Can LayoutAnimationController animate only specified Views

0

nel layout XML, provare ad aggiungere:

<ListView 
    android:id="@android:id/list" 
    ... 
    android:animateLayoutChanges="true"/> 

Questo animerà automaticamente inserimenti ed eliminazioni dal vostro ListView.
Se si dispone di un'animazione personalizzata, denominata anim_translate_left, utilizzare:

<ListView 
    android:id="@android:id/list" 
    ... 
    android:animateLayoutChanges="@anim/anim_translate_left"/> 

Fonte: Google API's

Problemi correlati