[android-developers] Re: Reusing Views in Custom Adapter

2011-11-29 Thread Kumar Bibek
What exactly is the problem. Bonkers doesn't really tell us much.

On Nov 29, 8:12 pm, authorwjf wfran...@softlayer.com wrote:
 Hi Android Framework Gurus!

 I am hoping someone out there can answer a question for me about re-
 using views in my adapters.  My understanding, is that for performance
 reasons this is something I should always always always do.  Yet in my
 experience, doing so always results in the view, whether a grid or
 list, going wonky once I get very many children in the view.  I
 suspect, I'm just doing something flat out wrong.  So I put together a
 simple straight-forward project to demonstrate both how I attempt to
 re-use the views in a grid view, and how it goes bonkers if you add a
 few hundred entries and scroll the list.  I've tested on both the
 cupcake emulator as well as my gingerbread device with the same
 results.

 Thanks in advance to anyone who takes the time to respond!

 ==Layouts==
 main.xml
 ?xml version=1.0 encoding=utf-8?
 LinearLayout xmlns:android=http://schemas.android.com/apk/res/
 android
     android:layout_width=fill_parent
     android:layout_height=fill_parent
     android:orientation=vertical 
     TextView
         android:layout_width=fill_parent
         android:layout_height=wrap_content
         android:text=Reuse Views Demo /
     GridView
                 android:id=@+id/gridview
                 android:layout_width=fill_parent
                 android:layout_height=fill_parent
         android:padding=5dp
             android:verticalSpacing=5dp
             android:horizontalSpacing=10dp
             android:numColumns=auto_fit
             android:columnWidth=60dp
             android:stretchMode=columnWidth
             android:gravity=center_horizontal/
 /LinearLayout

 grid_item.xml
 LinearLayout xmlns:android=http://schemas.android.com/apk/res/
 android
    android:id=@+id/GridItem
    android:layout_width=fill_parent
    android:layout_height=wrap_content
    android:orientation=vertical
    android:gravity=center_horizontal
    TextView android:id=@+id/grid_item_text
       android:layout_width=wrap_content
       android:layout_height=wrap_content
       android:gravity=center_horizontal
       android:layout_marginBottom=4dip/
 /LinearLayout

 ==source==
 Main.java
 package com.authorwjf.reuseviews;

 import java.util.ArrayList;

 import android.app.Activity;
 import android.os.Bundle;
 import android.widget.GridView;

 public class Main extends Activity {

         private CustomAdapter mAdapter;
         private ArrayListString mItems = new ArrayListString();

     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         for (int i = 0; i200; i++) {
                 mItems.add(Integer.toString(i));
         }
         mAdapter = new CustomAdapter(this, mItems);
         GridView g = (GridView) findViewById(R.id.gridview);
         g.setAdapter(mAdapter);
     }

 }

 CustomAdapter.java
 package com.authorwjf.reuseviews;
 import java.util.ArrayList;
 import com.authorwjf.reuseviews.R;
 import android.content.Context;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
 import android.widget.TextView;

 public class CustomAdapter extends BaseAdapter {

         private Context mContext;
         private ArrayListString mItems;

     public CustomAdapter(Context c, ArrayListString items) {
         mContext = c;
         mItems = items;
     }

         @Override
         public int getCount() {
                 return mItems.size();
         }

         @Override
         public Object getItem(int position) {
                 return mItems.get(position);
         }

         @Override
         public long getItemId(int position) {
                 return position;
         }

         @Override
         public View getView(int position, View convertView, ViewGroup parent)
 {
                 View v = convertView;
                 if (v == null) {
                          LayoutInflater li = (LayoutInflater)
 mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                  v = li.inflate(R.layout.grid_item, null);
                  TextView tv = (TextView)v.findViewById(R.id.grid_item_text);
                  tv.setText(Item #+mItems.get(position));
                 }
                 return v;
         }







 }

-- 
You received this message because you are subscribed to the Google
Groups Android Developers group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en


Re: [android-developers] Re: Reusing Views in Custom Adapter

2011-11-29 Thread YuviDroid
You should always set the whole content of the layout in getView(). When
v is not null right now you are returning that view without setting your
text.
Something like this:

public View getView(int position, View convertView, ViewGroup parent) {
   View v = convertView;
   if (v == null) {
LayoutInflater li = (LayoutInflater)
mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.grid_item, null);
   }

TextView tv = (TextView)v.findViewById(R.id.grid_item_text);
tv.setText(Item #+mItems.get(position));

   return v;
}

On Tue, Nov 29, 2011 at 5:17 PM, Kumar Bibek coomar@gmail.com wrote:

 What exactly is the problem. Bonkers doesn't really tell us much.

 On Nov 29, 8:12 pm, authorwjf wfran...@softlayer.com wrote:
  Hi Android Framework Gurus!
 
  I am hoping someone out there can answer a question for me about re-
  using views in my adapters.  My understanding, is that for performance
  reasons this is something I should always always always do.  Yet in my
  experience, doing so always results in the view, whether a grid or
  list, going wonky once I get very many children in the view.  I
  suspect, I'm just doing something flat out wrong.  So I put together a
  simple straight-forward project to demonstrate both how I attempt to
  re-use the views in a grid view, and how it goes bonkers if you add a
  few hundred entries and scroll the list.  I've tested on both the
  cupcake emulator as well as my gingerbread device with the same
  results.
 
  Thanks in advance to anyone who takes the time to respond!
 
  ==Layouts==
  main.xml
  ?xml version=1.0 encoding=utf-8?
  LinearLayout xmlns:android=http://schemas.android.com/apk/res/
  android
  android:layout_width=fill_parent
  android:layout_height=fill_parent
  android:orientation=vertical 
  TextView
  android:layout_width=fill_parent
  android:layout_height=wrap_content
  android:text=Reuse Views Demo /
  GridView
  android:id=@+id/gridview
  android:layout_width=fill_parent
  android:layout_height=fill_parent
  android:padding=5dp
  android:verticalSpacing=5dp
  android:horizontalSpacing=10dp
  android:numColumns=auto_fit
  android:columnWidth=60dp
  android:stretchMode=columnWidth
  android:gravity=center_horizontal/
  /LinearLayout
 
  grid_item.xml
  LinearLayout xmlns:android=http://schemas.android.com/apk/res/
  android
 android:id=@+id/GridItem
 android:layout_width=fill_parent
 android:layout_height=wrap_content
 android:orientation=vertical
 android:gravity=center_horizontal
 TextView android:id=@+id/grid_item_text
android:layout_width=wrap_content
android:layout_height=wrap_content
android:gravity=center_horizontal
android:layout_marginBottom=4dip/
  /LinearLayout
 
  ==source==
  Main.java
  package com.authorwjf.reuseviews;
 
  import java.util.ArrayList;
 
  import android.app.Activity;
  import android.os.Bundle;
  import android.widget.GridView;
 
  public class Main extends Activity {
 
  private CustomAdapter mAdapter;
  private ArrayListString mItems = new ArrayListString();
 
  @Override
  public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  for (int i = 0; i200; i++) {
  mItems.add(Integer.toString(i));
  }
  mAdapter = new CustomAdapter(this, mItems);
  GridView g = (GridView) findViewById(R.id.gridview);
  g.setAdapter(mAdapter);
  }
 
  }
 
  CustomAdapter.java
  package com.authorwjf.reuseviews;
  import java.util.ArrayList;
  import com.authorwjf.reuseviews.R;
  import android.content.Context;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.BaseAdapter;
  import android.widget.TextView;
 
  public class CustomAdapter extends BaseAdapter {
 
  private Context mContext;
  private ArrayListString mItems;
 
  public CustomAdapter(Context c, ArrayListString items) {
  mContext = c;
  mItems = items;
  }
 
  @Override
  public int getCount() {
  return mItems.size();
  }
 
  @Override
  public Object getItem(int position) {
  return mItems.get(position);
  }
 
  @Override
  public long getItemId(int position) {
  return position;
  }
 
  @Override
  public View getView(int position, View convertView, ViewGroup
 parent)
  {
  View v = convertView;
  if (v == null) {
   LayoutInflater li = 

[android-developers] Re: Reusing Views in Custom Adapter

2011-11-29 Thread authorwjf
You've hit the problem exactly YuvieDroid.  Boy do I feel dumb.  I
thought if the view was being re-used then the layout items on that
view were preserved as well.  Moving the bracket on the if statement
fixed the issue immediately.  Thanks!

On Nov 29, 1:44 pm, YuviDroid yuvidr...@gmail.com wrote:
 You should always set the whole content of the layout in getView(). When
 v is not null right now you are returning that view without setting your
 text.
 Something like this:

 public View getView(int position, View convertView, ViewGroup parent) {
                View v = convertView;
                if (v == null) {
                         LayoutInflater li = (LayoutInflater)
 mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                 v = li.inflate(R.layout.grid_item, null);
                }

                 TextView tv = (TextView)v.findViewById(R.id.grid_item_text);
                 tv.setText(Item #+mItems.get(position));

                return v;









 }
 On Tue, Nov 29, 2011 at 5:17 PM, Kumar Bibek coomar@gmail.com wrote:
  What exactly is the problem. Bonkers doesn't really tell us much.

  On Nov 29, 8:12 pm, authorwjf wfran...@softlayer.com wrote:
   Hi Android Framework Gurus!

   I am hoping someone out there can answer a question for me about re-
   using views in my adapters.  My understanding, is that for performance
   reasons this is something I should always always always do.  Yet in my
   experience, doing so always results in the view, whether a grid or
   list, going wonky once I get very many children in the view.  I
   suspect, I'm just doing something flat out wrong.  So I put together a
   simple straight-forward project to demonstrate both how I attempt to
   re-use the views in a grid view, and how it goes bonkers if you add a
   few hundred entries and scroll the list.  I've tested on both the
   cupcake emulator as well as my gingerbread device with the same
   results.

   Thanks in advance to anyone who takes the time to respond!

   ==Layouts==
   main.xml
   ?xml version=1.0 encoding=utf-8?
   LinearLayout xmlns:android=http://schemas.android.com/apk/res/
   android
       android:layout_width=fill_parent
       android:layout_height=fill_parent
       android:orientation=vertical 
       TextView
           android:layout_width=fill_parent
           android:layout_height=wrap_content
           android:text=Reuse Views Demo /
       GridView
                   android:id=@+id/gridview
                   android:layout_width=fill_parent
                   android:layout_height=fill_parent
           android:padding=5dp
               android:verticalSpacing=5dp
               android:horizontalSpacing=10dp
               android:numColumns=auto_fit
               android:columnWidth=60dp
               android:stretchMode=columnWidth
               android:gravity=center_horizontal/
   /LinearLayout

   grid_item.xml
   LinearLayout xmlns:android=http://schemas.android.com/apk/res/
   android
      android:id=@+id/GridItem
      android:layout_width=fill_parent
      android:layout_height=wrap_content
      android:orientation=vertical
      android:gravity=center_horizontal
      TextView android:id=@+id/grid_item_text
         android:layout_width=wrap_content
         android:layout_height=wrap_content
         android:gravity=center_horizontal
         android:layout_marginBottom=4dip/
   /LinearLayout

   ==source==
   Main.java
   package com.authorwjf.reuseviews;

   import java.util.ArrayList;

   import android.app.Activity;
   import android.os.Bundle;
   import android.widget.GridView;

   public class Main extends Activity {

           private CustomAdapter mAdapter;
           private ArrayListString mItems = new ArrayListString();

       @Override
       public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.main);
           for (int i = 0; i200; i++) {
                   mItems.add(Integer.toString(i));
           }
           mAdapter = new CustomAdapter(this, mItems);
           GridView g = (GridView) findViewById(R.id.gridview);
           g.setAdapter(mAdapter);
       }

   }

   CustomAdapter.java
   package com.authorwjf.reuseviews;
   import java.util.ArrayList;
   import com.authorwjf.reuseviews.R;
   import android.content.Context;
   import android.view.LayoutInflater;
   import android.view.View;
   import android.view.ViewGroup;
   import android.widget.BaseAdapter;
   import android.widget.TextView;

   public class CustomAdapter extends BaseAdapter {

           private Context mContext;
           private ArrayListString mItems;

       public CustomAdapter(Context c, ArrayListString items) {
           mContext = c;
           mItems = items;
       }

           @Override
           public int getCount() {
                   return mItems.size();
           }

           @Override
           public Object getItem(int position) {