2014-10-11 5 views
5

Voglio realizzare lo scambio oggetto ListView con animazioni come nella XE valuta ApplicazioneCome scambiare gli oggetti ListView con l'animazione?

XE animation

dall'elenco quando rubinetto utente su GBP-Sterlina britannica che fila salirà lato e montare su di INR - Rupia indiana con animazioni e riga INR - La Rupia indiana sostituirà la sterlina britannica GBP

Ho provato un'animazione in listview (intestazione usata in listview) quindi funziona perfettamente, ma il problema è che l'intestazione viene anche fatta scorrere verso l'alto e verso il basso con listview e voglio che la vista dell'intestazione (o qualsiasi vista) fissata in cima e sotto di essa possa essere scorsa

ho cercato un punto di vista fisso in alto in Layout relativa e mantenere listview sotto la vista superiore a quel momento l'animazione viene lavorato, ma solo all'interno ListView non fuori di ListView

come possiamo implementare che in Android?

+0

vedi questo progetto: https: //github.com/terlici/DragNDropList –

+0

@ y.feizi: questo è il progetto della biblioteca, dammi il link per la demo che usa questa libreria – Jayesh

risposta

1

Ho avuto un problema abbastanza simile qualche tempo fa. Avevo bisogno di avere una pagina, in cui posso riordinare le voci (brani musicali). Quindi, ecco la mia realizzazione:

mio AllTracksFragment, che permette di riordinare le tracce

public class AllTracksFragment extends SupportFragmentBase { 

    DynamicListView allTracksListView; 

    private ArrayList<Track> allTracksList = new ArrayList<>(); 
    TracksListViewAdapter allTracksAdapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_all_tracks, container, false); 
     setHasOptionsMenu(true); 

     allTracksListView = (DynamicListView)rootView .findViewById(R.id.allTracksListView); 

     Track track1 = new Track(); // Track is simple model class 
     track1.trackName = "Winter\'s Coming (Acoustic) 1"; 
     track1.trackId = "47580057"; 

     Track track2 = new Track(); 
     track2.trackName = "Winter\'s Coming (Acoustic) 2"; 
     track2.trackId = "47580057"; 

     Track track3 = new Track(); 
     track3.trackName = "Winter\'s Coming (Acoustic) 3"; 
     track3.trackId = "47580057"; 

     allTracksList.add(track1); 
     allTracksList.add(track2); 
     allTracksList.add(track3); 

     allTracksAdapter = new TracksListViewAdapter(allTracksList, eventBus); 
     allTracksListView.setTracksList(allTracksList); //SEE DynamicListView class 
     allTracksListView.setAdapter(allTracksAdapter); 
     allTracksListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

     return rootView; 
    } 
} 

E il layout AllTracksFragment:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.myapp.views.DynamicListView 
     android:id="@+id/allTracksListView" 
     android:layout_marginTop="12dp" 
     android:scrollbars="none" 
     android:divider="@null" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

</RelativeLayout> 

TracceLi stViewAdapter (se necessario):

public final class TracksListViewAdapter extends BaseListViewArrayAdapter<PlayTrackView, Track> { // extended version of simple BaseAdapter 

    final int INVALID_ID = -1; 

    public TracksListViewAdapter(final List<Track> tracks) { 
     super(tracks == null ? new ArrayList<Track>(0) : tracks); 
     if (tracks != null) { 
      for (int i = 0; i < tracks.size(); ++i) { 
       mIdMap.put(tracks.get(i), i); 
      } 
     } 
    } 

    public PlayTrackView createNewView(final Context context, final int position) { 
     return new PlayTrackView(context); // PlayTrackView - is an extension of FrameLayout 
    } 

    HashMap<Track, Integer> mIdMap = new HashMap<>(); 

    @Override 
    public long getItemId(int position) { 
     if (position < 0 || position >= mIdMap.size()) { 
      return INVALID_ID; 
     } 

     Track item = (Track) getItem(position); 
     return mIdMap.get(item); 
    } 

    @Override 
    public boolean hasStableIds() 
    { 
     return android.os.Build.VERSION.SDK_INT < 20; 
    } 
} 

PlayTrackView .java

public class PlayTrackView extends FrameLayout implements IItemDisplayer<Track> { 

    public PlayTrackView(Context context) { 
     super(context); 
     LayoutInflater.from(context).inflate(R.layout.play_track_view, this); 
    } 

    public PlayTrackView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     LayoutInflater.from(context).inflate(R.layout.play_track_view, this); 
    } 

    public PlayTrackView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     LayoutInflater.from(context).inflate(R.layout.play_track_view, this); 
    } 

    @Override 
    public void displayItem(Track track) { 

    } 
} 

cingolati .java

public class Track { 
    public String trackId; 
    public String trackName; 
} 

IItemDisplayer interfaccia

public interface IItemDisplayer<TItem> { 
    public void displayItem(TItem item); 
} 

BaseListViewAdapter

+0

che cos'è @Inject qui? quale libreria hai usato? sono annotazioni? – Jayesh

+0

@InjectView viene da Butter Knife. Significa solo DynamicListView allTracksListView = (DynamicListView) getFragmentView(). FindViewById (R.id.allTracksListView); (più breve e più facile da leggere + più efficace, per quanto ne so) (Aggiornamento della risposta per evitare questa iniezione) –

+0

ok, ma non riesco a trovare PlayTrackView, Track, BaseListViewArrayAdapter – Jayesh

2

Perché reinventare la ruota? Esiste un paio di librerie ben documentate e ben strutturate per trattare con ListView. Ad esempio, ListViewAnimations è il migliore, IMO.

Caratteristiche

  • animazioni Aspetto per gli articoli in ListViews, GridViews, altro AbsListViews
    • Costruito in animazioni includono Alpha, SwingRightIn, SwingLeftIn, SwingBottomIn, SwingRightIn e ScaleIn.
    • Altre animazioni possono essere facilmente aggiunte
    • StickyListHeaders è supportato, altre implementazioni possono essere facilmente aggiunte.
  • Swipe-to-Congeda, Swipe-To-Respingere con contestuale annullare
  • Drag-and-Drop riordinoThis is what you need
  • Animate aggiunta di elementi
  • intoppi espandere i vostri articoli per rivelare più contenuti

enter image description here

+0

La [biblioteca] raccomandata (https: // github. com/nhaarman/ListViewAnimations) è deprecato. –