and populate the row as we see fit before returning it. So, we do the following:

• Put the text label into our label widget, using the word at the supplied position.

• See if the word is longer than four characters and, if so, find our ImageView icon widget and replace the stock resource with a different one.

Now we have a ListView with different icons based upon context of that specific entry in the list (see Figure 9-2).

Figure 9-2. The DynamicDemo application

This was a fairly contrived example, but you can see where this technique could be used to customize rows based on any sort of criteria, such as other columns in a returned Cursor.

Better. Stronger. Faster.

The getView() implementation shown previously works, but it is inefficient. Every time the user scrolls, we have to create a bunch of new View objects to accommodate the newly shown rows. And since the Android framework does not cache existing View objects itself, we wind up making new row View objects even for rows we just created a second or two ago. This is bad.

It might be bad for the immediate user experience, if the list appears to be sluggish. More likely, though, it will be bad due to battery usage — every bit of CPU that is used eats up the battery. This is compounded by the extra work the garbage collector needs to do to get rid of all those extra objects you create. So the less efficient your code, the more quickly the phone’s battery will be drained, and the less happy the user will be. And you want happy users, right?

So, let us take a look at a few tricks to make your fancy ListView widgets more efficient. 

Using convertView

The getView() method receives, as one of its parameters, a View named, by convention, convertView. Sometimes convertView will be null. In those cases, you have to create a new row View from scratch (e.g., via inflation), just as we did before.

However, if convertView is not null, then it is actually one of your previously created Views. This will be the case primarily when the user scrolls the ListView — as new rows appear, Android will attempt to recycle the views of the rows that scrolled off the other end of the list, to save you having to rebuild them from scratch.

Assuming that each of your rows has the same basic structure, you can use findViewById() to get at the individual widgets that make up your row and change their contents, then return convertView from getView() rather than create a whole new row.

For example, here is the getView() implementation from last time, now optimized via convertView (from the FancyLists/Recycling project at http://apress.com/):

public class RecyclingDemo extends ListActivity {

 TextView selection;

 String[] items={'lorem', 'ipsum', 'dolor', 'sit', 'amet',

  'consectetuer', 'adipiscing', 'elit', 'morbi', 'vel',

  'ligula', 'vitae', 'arcu', 'aliquet', 'mollis',

  'etiam', 'vel', 'erat', 'placerat', 'ante',

  'porttitor', 'sodales', 'pellentesque', 'augue',

  'purus'};

 @Override

 public void onCreate(Bundle icicle) {

  super.onCreate(icicle);

  setContentView(R.layout.main);

  setListAdapter(new IconicAdapter (this));

  selection = (TextView)findViewById(R.id.selection);

 }

 public void onListItemClick(ListView parent, View v,

  int position, long id) {

  selection.setText(items[position]);

 }

 class IconicAdapter extends ArrayAdapter {

  Activity context;

  IconicAdapter(Activity context) {

   super(context, R.layout.row, items);

   this.context = context;

  }

  public View getView(int position, View convertView,

   ViewGroup parent) {

   View row = convertView;

   if (row==null) {

    LayoutInflater inflater = context.getLayoutInflater();

    row = inflater.inflate(R.layout.row, null);

   }

   TextView label = (TextView)row.findViewById(R.id.label);

   label.setText(items[position]);

   ImageView icon = (ImageView)row.findViewById(R.id.icon);

   if (items[position].length() > 4) {

    icon.setImageResource(R.drawable.delete);

   } else {

    icon.setImageResource(R.drawable.ok);

   }

Вы читаете Beginning Android
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату