1faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/* 2faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Copyright (C) 2013 The Android Open Source Project 3faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * 4faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Licensed under the Apache License, Version 2.0 (the "License"); 5faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * you may not use this file except in compliance with the License. 6faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * You may obtain a copy of the License at 7faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * 8faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * http://www.apache.org/licenses/LICENSE-2.0 9faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * 10faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Unless required by applicable law or agreed to in writing, software 11faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * distributed under the License is distributed on an "AS IS" BASIS, 12faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * See the License for the specific language governing permissions and 14faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * limitations under the License. 15faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 16faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haasepackage com.android.transitiontests; 17faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 18faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.app.Activity; 19faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.content.Context; 20faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.os.Bundle; 21faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.View; 22faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.ViewTreeObserver; 23d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.transition.Fade; 24d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.transition.Scene; 25faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.widget.AdapterView; 26faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.widget.ArrayAdapter; 27faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.widget.LinearLayout; 28faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.widget.ListView; 29faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.widget.TextView; 30d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.transition.AutoTransition; 31d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.transition.ChangeBounds; 32d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.transition.Transition; 33d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.transition.TransitionSet; 34d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.transition.TransitionManager; 35faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 36faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport java.util.ArrayList; 37faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport java.util.HashMap; 38faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport java.util.List; 39faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 40faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haasepublic class ListViewAddRemove extends Activity { 41faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 42faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase final ArrayList<String> numList = new ArrayList<String>(); 43faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 44faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 45faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase public void onCreate(Bundle savedInstanceState) { 46faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase super.onCreate(savedInstanceState); 47faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase setContentView(R.layout.list_view_add_remove); 48faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 49faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase final LinearLayout container = (LinearLayout) findViewById(R.id.container); 50faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 51faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase final ListView listview = (ListView) findViewById(R.id.listview); 52faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase for (int i = 0; i < 200; ++i) { 53faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase numList.add(Integer.toString(i)); 54faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 55faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase final StableArrayAdapter adapter = new StableArrayAdapter(this, 56faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase android.R.layout.simple_list_item_1, numList); 57faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase listview.setAdapter(adapter); 58faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 59faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase final ViewTreeObserver observer = container.getViewTreeObserver(); 60faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 61faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase public void onGlobalLayout() { 62faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase System.out.println("-------------------------------------"); 63faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase System.out.println("onLayoutListener: listview view tops: "); 64faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase for (int i = 0; i < listview.getChildCount(); ++i) { 65faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase TextView view = (TextView) listview.getChildAt(i); 66faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase System.out.println(" " + view.getText() + ": " + view.getTop()); 67faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 68faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 69faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase }); 70faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 71faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase final Scene mySceneChanger = new Scene(listview); 72faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 73faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase mySceneChanger.setEnterAction(new Runnable() { 74faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 75faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase public void run() { 76faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase numList.remove(mItemToDelete); 77faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase adapter.notifyDataSetChanged(); 78faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 79faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase }); 80faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase final Transition myTransition = new AutoTransition(); 81d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase final TransitionSet noFadeIn = new TransitionSet(). 82d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase setOrdering(TransitionSet.ORDERING_SEQUENTIAL); 83faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase Fade fadeIn = new Fade(Fade.IN); 84faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase fadeIn.setDuration(50); 85d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase noFadeIn.addTransition(new Fade(Fade.OUT)).addTransition(new ChangeBounds()).addTransition(fadeIn); 86faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 87faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase myTransition.addListener(new Transition.TransitionListenerAdapter() { 88faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 89faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase public void onTransitionStart(Transition transition) { 90faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase System.out.println("---------ListView Tops: Before--------"); 91faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase for (int i = 0; i < listview.getChildCount(); ++i) { 92faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase TextView view = (TextView) listview.getChildAt(i); 93faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase int position = listview.getPositionForView(view); 94faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 95faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 96faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 97faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 98faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase public void onTransitionEnd(Transition transition) { 99faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase System.out.println("---------ListView Tops: After--------"); 100faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase for (int i = 0; i < listview.getChildCount(); ++i) { 101faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase TextView view = (TextView) listview.getChildAt(i); 102faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase int position = listview.getPositionForView(view); 103faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase if (view.hasTransientState()) { 104faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase// view.setHasTransientState(false); 105faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 106faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 107faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase myTransition.removeListener(this); 108faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 109faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase }); 110faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 111faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 112faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 113faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 114faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase public void onItemClick(AdapterView<?> parent, final View view, int position, long id) { 115faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase System.out.println("---------ListView Tops: OnClick--------"); 116faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase String item = (String) parent.getItemAtPosition(position); 117faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase for (int i = 0; i < listview.getChildCount(); ++i) { 118faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase TextView v = (TextView) listview.getChildAt(i); 119faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase if (!item.equals(v.getText())) { 120faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase// v.setHasTransientState(true); 121faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 122faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 123faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase// listview.setHasTransientState(true); 124faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase mItemToDelete = item; 125faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase// numList.remove(item); 126faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase TransitionManager.go(mySceneChanger, noFadeIn); 127faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase// view.postDelayed(new Runnable() { 128faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase// @Override 129faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase// public void run() { 130faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase// for (int i = 0; i < listview.getChildCount(); ++i) { 131faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase// TextView v = (TextView) listview.getChildAt(i); 132faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase// v.setHasTransientState(false); 133faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase// } 134faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase// } 135faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase// }, 200); 136faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 137faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 138faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase }); 139faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 140faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 141faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase String mItemToDelete = null; 142faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 143faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase private class StableArrayAdapter extends ArrayAdapter<String> { 144faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 145faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase HashMap<String, Integer> mIdMap = new HashMap<String, Integer>(); 146faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 147faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase public StableArrayAdapter(Context context, int textViewResourceId, 148faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase List<String> objects) { 149faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase super(context, textViewResourceId, objects); 150faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase for (int i = 0; i < objects.size(); ++i) { 151faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase mIdMap.put(objects.get(i), i); 152faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 153faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 154faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 155faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 156faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase public long getItemId(int position) { 157faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase String item = getItem(position); 158faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase return mIdMap.get(item); 159faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 160faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 161faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 162faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase public boolean hasStableIds() { 163faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase return true; 164faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 165faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 166faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 167faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase} 168