SlideShare una empresa de Scribd logo
1 de 38
Descargar para leer sin conexión
Android UI Development:
Tips, Tricks, and Techniques
                      Romain Guy
                       Chet Haase
           Android UI Toolkit Team
                           Google
Android UI Development:
          rrific Tips,Tricks, and Techniques
    lly Te
Tota
                                      Romain Guy
                                       Chet Haase
                           Android UI Toolkit Team
                                           Google
Trash Talk
Trash Talk
            or
Garbage Zero
  Avoid creating garbage,
when necessary and possible
Statics as Temporaries
• Instead of a temporary object:
    public boolean pointInArea(int x, int y, Area area) {
      Point testPoint = new Point(x, y);
      return area.intersect(testPoint);
    }


• Consider a static instead:
    static final Point tmpPoint = new Point();

    public boolean pointInArea(int x, int y, Area area) {
      tmpPoint.x = x;
      tmpPoint.y = y;
      return area.intersect(tmpPoint.yPoint);
    }


                                                       5
AutoBoxing
• Autoboxing creates Objects

     float x = 5;
     Float y = x;
     doSomething(x);

     void doSomething(Float z) {}



                       is equivalent to
     float x = 5;
     Float y = new Float(x);
     doSomething(new Float(x));

     void doSomething(Float z) {}


                                          6
De-Autoboxing
• Use primitive types whenever possible
 –Avoids Object creation
• Use types you need for the situation
 –Avoids autoboxing back and forth




                                          7
Obliterator
• The enhanced for() loop is great
• ... but creates garbage
          for (Node node : nodeList) {}


               is equivalent to
          Iterator iter = nodeList.iterator();
          while (iter.hasNext()) {}


• Consider a size check first:
          if (nodeList.size() > 0) {
            for (Node node : nodeList) {}
          }


                                                 8
Image is Everything
• Recycle those Bitmaps
  –Device resources are limited
• Finalizers will clear them ... eventually
• You might think this would help
         // done using this one, clear reference
         myBitmap = null;

• But you really want to do this
         // done using this one, recycle it
         myBitmap.recycle();

• Don’t wait for the finalizer to do the work if you
  need that memory now

                                                   9
Varargh
• Parameters to varargs method packaged into a
  temporary array
       void someMethod(float... args) {}

       someMethod(5f);


               is equivalent to
       someMethod(new float[]{5});




                                           10
Gener-ick
• T doesn’t stand for “primitive Type”
             public class MyClass<T> {
               T myVar;
               MyClass<T>(T arg) {
                 myVar = arg;
               }
             }

• Generics only deal with Objects; primitive types
  get autoboxed
            float f;
            MyClass<Float> myObject =
              new MyClass<Float>(f);

            which is equivalent to
            MyClass<Float> myObject =
              new MyClass<Float>(new Float(f));
                                                  11
Tools: Allocation Tracking
• Limit allocations to find problems
        int prevLimt = -1;
        try {
          prevLimit =
        Debug.setAllocationLimit(0);
          // Do stuff
        } finally {
          Debug.setAllocationLimit(-1);
        }

• Count the allocations being made
        Debug.startAllocationCounting();
        // do stuff
        int allocCount = Debug.getThreadAllocCount();
        Debug.stopAllocationCounting);



                                                        12
Tools: DDMS
• Visual tool helps track allocations down to the
  object/file/line number
• (demo)




                                           13
Watch the Garbage...
But Don’t Be Silly
• As Michael Abrash might have said:
                                 ViewRoot
 –“Premature optimization is the Root of all evil”


• Minor garbage is irrelevant in most cases
• But if you have GCs at critical points in your
  application, consider Garbage Zero
 –Example: animations

                                                 14
Tools: hat
• DDMS
• Heap Analysis Tool is used to track down
  memory leaks
• adb shell dumpsys meminfo <process>




                                         15
Memory leaks
• Be careful with Context
• Be careful with static fields
• Avoid non-static inner classes
• Use weak references




                                   16
YOU and I
Responsiveness
• Single-threaded UI
• Don’t block the UI thread
 – Also called main thread
• AsyncTask
 – Worker thread and UI thread messaging
• Handler
 – Messaging




                                           18
Overinvalidating
• Only redraw what you must
• (demo)




                              19
Fewer is better
• Many views
 – Slower layout
 – Slower drawing
 – Slower startup time
• Deep hierarchies
 – Memory
 – Slow...
 – StackOverflowException



                            20
HiearchyViewer
Layout optimizations
• Custom views
• Custom layouts
• <merge />
• ViewStub
• Compound drawables
• layoutopt




                       22
ViewStub




           23
ViewStub




           24
ViewStub

   <ViewStub
       android:id="@+id/stub_import"
       android:inflatedId="@+id/panel_import"

       android:layout="@layout/progress_overlay"

       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_gravity="bottom" />




                                                25
ViewStub



findViewById(R.id.stub_import).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub)
        findViewById(R.id.stub_import)).inflate();




                                                  26
<merge/>




           27
<merge/>



<!-- The merge tag must be the root tag -->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Content -->
</merge>




                                                        28
Compound drawables
   <LinearLayout
       android:orientation="horizontal"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content">

       <ImageView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:src="@drawable/icon" />
       <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@string/hello" />

   </LinearLayout>

                                               29
Compound drawables


   <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/hello"
       android:drawableLeft="@drawable/icon" />




                                                  30
layoutopt
ListView


  1 public View getView(int position, View convertView, ViewGroup parent) {
  2     View item = mInflater.inflate(R.layout.list_item_icon_text, null);

  3     ((TextView) item.findViewById(R.id.text)).setText(DATA[position]);
  4     ((ImageView) item.findViewById(R.id.icon)).setImageBitmap(
  5             (position & 1) == 1 ? mIcon1 : mIcon2);

  6     return item;
  7 }




                                                                32
ListView


1 public View getView(int position, View convertView, ViewGroup parent) {
2     if (convertView == null) {
3         convertView = mInflater.inflate(R.layout.item, parent, false);
4     }

5     ((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);
6     ((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap(
7             (position & 1) == 1 ? mIcon1 : mIcon2);

8     return convertView;
9 }




                                                                 33
ListView


           static class ViewHolder {
               TextView text;
               ImageView icon;
           }




                                       34
ListView
  1 public View getView(int position, View convertView, ViewGroup parent) {
  2     ViewHolder holder;
  3
  4     if (convertView == null) {
  5         convertView = mInflater.inflate(R.layout.list_item_icon_text,
  6                 parent, false);
  7         holder = new ViewHolder();
  8         holder.text = (TextView) convertView.findViewById(R.id.text);
  9         holder.icon = (ImageView) convertView.findViewById(R.id.icon);
 10
 11         convertView.setTag(holder);
 12     } else {
 13         holder = (ViewHolder) convertView.getTag();
 14     }
 15
 16     holder.text.setText(DATA[position]);
 17     holder.icon.setImageBitmap((position & 1) ==? mIcon1 : mIcon2);
 18
 19     return convertView;
 20 }

                                                                35
ListView
   60.0

   50.0

   40.0

   30.0

   20.0

   10.0

     0
            Dumb             Correct            Fast
           List of 10,000 items on NexusOne, Android 2.2
                                                       36
Graphics optimizations
• Pre-scale bitmaps
• Use compatible bitmaps
 – ARGB_8888 to draw on 32 bits window
• Avoid blending
• Use View drawing caches
 – View.setDrawingCacheEnabled(true)
• View.isOpaque()



                                         37
For More Information
• Android developer site
 –developer.android.com
• Romain
 –@romainguy
 –curious-creature.org
• Chet
 –@chethaase
 –graphics-geek.blogspot.com



                               38

Más contenido relacionado

Destacado (6)

Optimize your delivery and quality with the right release methodology and too...
Optimize your delivery and quality with the right release methodology and too...Optimize your delivery and quality with the right release methodology and too...
Optimize your delivery and quality with the right release methodology and too...
 
Tech Talk #2: Android app performance tips
Tech Talk #2: Android app performance tipsTech Talk #2: Android app performance tips
Tech Talk #2: Android app performance tips
 
Recyclerview in action
Recyclerview in action Recyclerview in action
Recyclerview in action
 
Write cleaner, maintainable, and testable code in Android with MVVM
Write cleaner, maintainable, and testable code in Android with MVVMWrite cleaner, maintainable, and testable code in Android with MVVM
Write cleaner, maintainable, and testable code in Android with MVVM
 
Mastering RecyclerView Layouts
Mastering RecyclerView LayoutsMastering RecyclerView Layouts
Mastering RecyclerView Layouts
 
Effective Android UI - English
Effective Android UI - EnglishEffective Android UI - English
Effective Android UI - English
 

Similar a Android UI Tips, Tricks and Techniques

ProTips DroidCon Paris 2013
ProTips DroidCon Paris 2013ProTips DroidCon Paris 2013
ProTips DroidCon Paris 2013
Mathias Seguy
 
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficientTh 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
Bin Shao
 
Advanced Memory Management on iOS and Android - Mark Probst and Rodrigo Kumpera
Advanced Memory Management on iOS and Android - Mark Probst and Rodrigo KumperaAdvanced Memory Management on iOS and Android - Mark Probst and Rodrigo Kumpera
Advanced Memory Management on iOS and Android - Mark Probst and Rodrigo Kumpera
Xamarin
 
Creating custom views
Creating custom viewsCreating custom views
Creating custom views
Mu Chun Wang
 
Android Support Library
Android Support LibraryAndroid Support Library
Android Support Library
Alexey Ustenko
 
Android activity, service, and broadcast recievers
Android activity, service, and broadcast recieversAndroid activity, service, and broadcast recievers
Android activity, service, and broadcast recievers
Utkarsh Mankad
 

Similar a Android UI Tips, Tricks and Techniques (20)

ProTips DroidCon Paris 2013
ProTips DroidCon Paris 2013ProTips DroidCon Paris 2013
ProTips DroidCon Paris 2013
 
React Native custom components
React Native custom componentsReact Native custom components
React Native custom components
 
Design Patterns for Tablets and Smartphones
Design Patterns for Tablets and SmartphonesDesign Patterns for Tablets and Smartphones
Design Patterns for Tablets and Smartphones
 
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficientTh 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
 
Advanced Memory Management on iOS and Android - Mark Probst and Rodrigo Kumpera
Advanced Memory Management on iOS and Android - Mark Probst and Rodrigo KumperaAdvanced Memory Management on iOS and Android - Mark Probst and Rodrigo Kumpera
Advanced Memory Management on iOS and Android - Mark Probst and Rodrigo Kumpera
 
Action bar
Action barAction bar
Action bar
 
Creating custom views
Creating custom viewsCreating custom views
Creating custom views
 
Android Support Library
Android Support LibraryAndroid Support Library
Android Support Library
 
Jollen's Presentation: Introducing Android low-level
Jollen's Presentation: Introducing Android low-levelJollen's Presentation: Introducing Android low-level
Jollen's Presentation: Introducing Android low-level
 
Business Dashboards using Bonobo ETL, Grafana and Apache Airflow
Business Dashboards using Bonobo ETL, Grafana and Apache AirflowBusiness Dashboards using Bonobo ETL, Grafana and Apache Airflow
Business Dashboards using Bonobo ETL, Grafana and Apache Airflow
 
Responsible JavaScript
Responsible JavaScriptResponsible JavaScript
Responsible JavaScript
 
CS101- Introduction to Computing- Lecture 35
CS101- Introduction to Computing- Lecture 35CS101- Introduction to Computing- Lecture 35
CS101- Introduction to Computing- Lecture 35
 
W-JAX 09 - Lift
W-JAX 09 - LiftW-JAX 09 - Lift
W-JAX 09 - Lift
 
Day 1
Day 1Day 1
Day 1
 
Android activity, service, and broadcast recievers
Android activity, service, and broadcast recieversAndroid activity, service, and broadcast recievers
Android activity, service, and broadcast recievers
 
Enhancing UI/UX using Java animations
Enhancing UI/UX using Java animationsEnhancing UI/UX using Java animations
Enhancing UI/UX using Java animations
 
【Unite 2017 Tokyo】ScriptableObjectを使ってプログラマーもアーティストも幸せになろう
【Unite 2017 Tokyo】ScriptableObjectを使ってプログラマーもアーティストも幸せになろう【Unite 2017 Tokyo】ScriptableObjectを使ってプログラマーもアーティストも幸せになろう
【Unite 2017 Tokyo】ScriptableObjectを使ってプログラマーもアーティストも幸せになろう
 
Introduction to interactive data visualisation using R Shiny
Introduction to interactive data visualisation using R ShinyIntroduction to interactive data visualisation using R Shiny
Introduction to interactive data visualisation using R Shiny
 
Rubymotion talk
Rubymotion talkRubymotion talk
Rubymotion talk
 
Android 3
Android 3Android 3
Android 3
 

Más de Marakana Inc.

Behavior Driven Development
Behavior Driven DevelopmentBehavior Driven Development
Behavior Driven Development
Marakana Inc.
 
Why Java Needs Hierarchical Data
Why Java Needs Hierarchical DataWhy Java Needs Hierarchical Data
Why Java Needs Hierarchical Data
Marakana Inc.
 
Pictures from "Learn about RenderScript" meetup at SF Android User Group
Pictures from "Learn about RenderScript" meetup at SF Android User GroupPictures from "Learn about RenderScript" meetup at SF Android User Group
Pictures from "Learn about RenderScript" meetup at SF Android User Group
Marakana Inc.
 
2010 07-18.wa.rails tdd-6
2010 07-18.wa.rails tdd-62010 07-18.wa.rails tdd-6
2010 07-18.wa.rails tdd-6
Marakana Inc.
 
Graphicsand animations devoxx2010 (1)
Graphicsand animations devoxx2010 (1)Graphicsand animations devoxx2010 (1)
Graphicsand animations devoxx2010 (1)
Marakana Inc.
 

Más de Marakana Inc. (20)

Android Services Black Magic by Aleksandar Gargenta
Android Services Black Magic by Aleksandar GargentaAndroid Services Black Magic by Aleksandar Gargenta
Android Services Black Magic by Aleksandar Gargenta
 
JRuby at Square
JRuby at SquareJRuby at Square
JRuby at Square
 
Behavior Driven Development
Behavior Driven DevelopmentBehavior Driven Development
Behavior Driven Development
 
Martin Odersky: What's next for Scala
Martin Odersky: What's next for ScalaMartin Odersky: What's next for Scala
Martin Odersky: What's next for Scala
 
Why Java Needs Hierarchical Data
Why Java Needs Hierarchical DataWhy Java Needs Hierarchical Data
Why Java Needs Hierarchical Data
 
Deep Dive Into Android Security
Deep Dive Into Android SecurityDeep Dive Into Android Security
Deep Dive Into Android Security
 
Securing Android
Securing AndroidSecuring Android
Securing Android
 
Pictures from "Learn about RenderScript" meetup at SF Android User Group
Pictures from "Learn about RenderScript" meetup at SF Android User GroupPictures from "Learn about RenderScript" meetup at SF Android User Group
Pictures from "Learn about RenderScript" meetup at SF Android User Group
 
2010 07-18.wa.rails tdd-6
2010 07-18.wa.rails tdd-62010 07-18.wa.rails tdd-6
2010 07-18.wa.rails tdd-6
 
Efficient Rails Test-Driven Development - Week 6
Efficient Rails Test-Driven Development - Week 6Efficient Rails Test-Driven Development - Week 6
Efficient Rails Test-Driven Development - Week 6
 
Graphicsand animations devoxx2010 (1)
Graphicsand animations devoxx2010 (1)Graphicsand animations devoxx2010 (1)
Graphicsand animations devoxx2010 (1)
 
What's this jQuery? Where it came from, and how it will drive innovation
What's this jQuery? Where it came from, and how it will drive innovationWhat's this jQuery? Where it came from, and how it will drive innovation
What's this jQuery? Where it came from, and how it will drive innovation
 
jQuery State of the Union - Yehuda Katz
jQuery State of the Union - Yehuda KatzjQuery State of the Union - Yehuda Katz
jQuery State of the Union - Yehuda Katz
 
Pics from: "James Gosling on Apple, Apache, Google, Oracle and the Future of ...
Pics from: "James Gosling on Apple, Apache, Google, Oracle and the Future of ...Pics from: "James Gosling on Apple, Apache, Google, Oracle and the Future of ...
Pics from: "James Gosling on Apple, Apache, Google, Oracle and the Future of ...
 
Efficient Rails Test Driven Development (class 4) by Wolfram Arnold
Efficient Rails Test Driven Development (class 4) by Wolfram ArnoldEfficient Rails Test Driven Development (class 4) by Wolfram Arnold
Efficient Rails Test Driven Development (class 4) by Wolfram Arnold
 
Efficient Rails Test Driven Development (class 3) by Wolfram Arnold
Efficient Rails Test Driven Development (class 3) by Wolfram ArnoldEfficient Rails Test Driven Development (class 3) by Wolfram Arnold
Efficient Rails Test Driven Development (class 3) by Wolfram Arnold
 
Learn about JRuby Internals from one of the JRuby Lead Developers, Thomas Enebo
Learn about JRuby Internals from one of the JRuby Lead Developers, Thomas EneboLearn about JRuby Internals from one of the JRuby Lead Developers, Thomas Enebo
Learn about JRuby Internals from one of the JRuby Lead Developers, Thomas Enebo
 
Replacing Java Incrementally
Replacing Java IncrementallyReplacing Java Incrementally
Replacing Java Incrementally
 
Learn to Build like you Code with Apache Buildr
Learn to Build like you Code with Apache BuildrLearn to Build like you Code with Apache Buildr
Learn to Build like you Code with Apache Buildr
 
Learn How to Unit Test Your Android Application (with Robolectric)
Learn How to Unit Test Your Android Application (with Robolectric)Learn How to Unit Test Your Android Application (with Robolectric)
Learn How to Unit Test Your Android Application (with Robolectric)
 

Android UI Tips, Tricks and Techniques

  • 1. Android UI Development: Tips, Tricks, and Techniques Romain Guy Chet Haase Android UI Toolkit Team Google
  • 2. Android UI Development: rrific Tips,Tricks, and Techniques lly Te Tota Romain Guy Chet Haase Android UI Toolkit Team Google
  • 4. Trash Talk or Garbage Zero Avoid creating garbage, when necessary and possible
  • 5. Statics as Temporaries • Instead of a temporary object: public boolean pointInArea(int x, int y, Area area) { Point testPoint = new Point(x, y); return area.intersect(testPoint); } • Consider a static instead: static final Point tmpPoint = new Point(); public boolean pointInArea(int x, int y, Area area) { tmpPoint.x = x; tmpPoint.y = y; return area.intersect(tmpPoint.yPoint); } 5
  • 6. AutoBoxing • Autoboxing creates Objects float x = 5; Float y = x; doSomething(x); void doSomething(Float z) {} is equivalent to float x = 5; Float y = new Float(x); doSomething(new Float(x)); void doSomething(Float z) {} 6
  • 7. De-Autoboxing • Use primitive types whenever possible –Avoids Object creation • Use types you need for the situation –Avoids autoboxing back and forth 7
  • 8. Obliterator • The enhanced for() loop is great • ... but creates garbage for (Node node : nodeList) {} is equivalent to Iterator iter = nodeList.iterator(); while (iter.hasNext()) {} • Consider a size check first: if (nodeList.size() > 0) { for (Node node : nodeList) {} } 8
  • 9. Image is Everything • Recycle those Bitmaps –Device resources are limited • Finalizers will clear them ... eventually • You might think this would help // done using this one, clear reference myBitmap = null; • But you really want to do this // done using this one, recycle it myBitmap.recycle(); • Don’t wait for the finalizer to do the work if you need that memory now 9
  • 10. Varargh • Parameters to varargs method packaged into a temporary array void someMethod(float... args) {} someMethod(5f); is equivalent to someMethod(new float[]{5}); 10
  • 11. Gener-ick • T doesn’t stand for “primitive Type” public class MyClass<T> { T myVar; MyClass<T>(T arg) { myVar = arg; } } • Generics only deal with Objects; primitive types get autoboxed float f; MyClass<Float> myObject = new MyClass<Float>(f); which is equivalent to MyClass<Float> myObject = new MyClass<Float>(new Float(f)); 11
  • 12. Tools: Allocation Tracking • Limit allocations to find problems int prevLimt = -1; try { prevLimit = Debug.setAllocationLimit(0); // Do stuff } finally { Debug.setAllocationLimit(-1); } • Count the allocations being made Debug.startAllocationCounting(); // do stuff int allocCount = Debug.getThreadAllocCount(); Debug.stopAllocationCounting); 12
  • 13. Tools: DDMS • Visual tool helps track allocations down to the object/file/line number • (demo) 13
  • 14. Watch the Garbage... But Don’t Be Silly • As Michael Abrash might have said: ViewRoot –“Premature optimization is the Root of all evil” • Minor garbage is irrelevant in most cases • But if you have GCs at critical points in your application, consider Garbage Zero –Example: animations 14
  • 15. Tools: hat • DDMS • Heap Analysis Tool is used to track down memory leaks • adb shell dumpsys meminfo <process> 15
  • 16. Memory leaks • Be careful with Context • Be careful with static fields • Avoid non-static inner classes • Use weak references 16
  • 18. Responsiveness • Single-threaded UI • Don’t block the UI thread – Also called main thread • AsyncTask – Worker thread and UI thread messaging • Handler – Messaging 18
  • 19. Overinvalidating • Only redraw what you must • (demo) 19
  • 20. Fewer is better • Many views – Slower layout – Slower drawing – Slower startup time • Deep hierarchies – Memory – Slow... – StackOverflowException 20
  • 22. Layout optimizations • Custom views • Custom layouts • <merge /> • ViewStub • Compound drawables • layoutopt 22
  • 23. ViewStub 23
  • 24. ViewStub 24
  • 25. ViewStub <ViewStub android:id="@+id/stub_import" android:inflatedId="@+id/panel_import" android:layout="@layout/progress_overlay" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" /> 25
  • 26. ViewStub findViewById(R.id.stub_import).setVisibility(View.VISIBLE); // or View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate(); 26
  • 27. <merge/> 27
  • 28. <merge/> <!-- The merge tag must be the root tag --> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Content --> </merge> 28
  • 29. Compound drawables <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout> 29
  • 30. Compound drawables <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello" android:drawableLeft="@drawable/icon" /> 30
  • 32. ListView 1 public View getView(int position, View convertView, ViewGroup parent) { 2 View item = mInflater.inflate(R.layout.list_item_icon_text, null); 3 ((TextView) item.findViewById(R.id.text)).setText(DATA[position]); 4 ((ImageView) item.findViewById(R.id.icon)).setImageBitmap( 5 (position & 1) == 1 ? mIcon1 : mIcon2); 6 return item; 7 } 32
  • 33. ListView 1 public View getView(int position, View convertView, ViewGroup parent) { 2 if (convertView == null) { 3 convertView = mInflater.inflate(R.layout.item, parent, false); 4 } 5 ((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]); 6 ((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap( 7 (position & 1) == 1 ? mIcon1 : mIcon2); 8 return convertView; 9 } 33
  • 34. ListView static class ViewHolder { TextView text; ImageView icon; } 34
  • 35. ListView 1 public View getView(int position, View convertView, ViewGroup parent) { 2 ViewHolder holder; 3 4 if (convertView == null) { 5 convertView = mInflater.inflate(R.layout.list_item_icon_text, 6 parent, false); 7 holder = new ViewHolder(); 8 holder.text = (TextView) convertView.findViewById(R.id.text); 9 holder.icon = (ImageView) convertView.findViewById(R.id.icon); 10 11 convertView.setTag(holder); 12 } else { 13 holder = (ViewHolder) convertView.getTag(); 14 } 15 16 holder.text.setText(DATA[position]); 17 holder.icon.setImageBitmap((position & 1) ==? mIcon1 : mIcon2); 18 19 return convertView; 20 } 35
  • 36. ListView 60.0 50.0 40.0 30.0 20.0 10.0 0 Dumb Correct Fast List of 10,000 items on NexusOne, Android 2.2 36
  • 37. Graphics optimizations • Pre-scale bitmaps • Use compatible bitmaps – ARGB_8888 to draw on 32 bits window • Avoid blending • Use View drawing caches – View.setDrawingCacheEnabled(true) • View.isOpaque() 37
  • 38. For More Information • Android developer site –developer.android.com • Romain –@romainguy –curious-creature.org • Chet –@chethaase –graphics-geek.blogspot.com 38