0

Hello, I am doing tutorials from book "Android programming tutorials", I am having problems understanding Tutorial 5. This is the main Java class:

package tiago.tutorial;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.LayoutInflater;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RadioGroup;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;

public class Now extends Activity {
  List<Restaurant> model = new ArrayList<Restaurant>();
  RestaurantAdapter adapter = null;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button save = (Button) findViewById(R.id.save);

    save.setOnClickListener(onSave);

    ListView list = (ListView) findViewById(R.id.restaurants);

    adapter = new RestaurantAdapter();
    list.setAdapter(adapter);
  }

  private View.OnClickListener onSave = new View.OnClickListener() {
    public void onClick(View v) {
      Restaurant r = new Restaurant();

      EditText name = (EditText) findViewById(R.id.name);
      EditText address = (EditText) findViewById(R.id.addr);

      r.setName(name.getText().toString());
      r.setAddress(address.getText().toString());

      RadioGroup types = (RadioGroup) findViewById(R.id.types);

      switch (types.getCheckedRadioButtonId()) {
        case R.id.sit_down:
          r.setType("sit_down");
          break;

        case R.id.take_out:
          r.setType("take_out");
          break;

        case R.id.delivery:
          r.setType("delivery");
          break;
      }

      adapter.add(r);
    }
  };

  class RestaurantAdapter extends ArrayAdapter<Restaurant> {
    RestaurantAdapter() {
      super(Now.this, R.layout.row, model);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
      View row = convertView;
      RestaurantHolder holder = null;

      if (row==null) {                          
        LayoutInflater inflater = getLayoutInflater();

        row=inflater.inflate(R.layout.row, parent, false);
        holder = new RestaurantHolder(row);
        row.setTag(holder);
      }
      else {
        holder = (RestaurantHolder) row.getTag();
      }

      holder.populateFrom(model.get(position));

      return(row);
    }
  }

  static class RestaurantHolder {
    private TextView name = null;
    private TextView address = null;
    private ImageView icon = null;

    RestaurantHolder(View row) {
      name = (TextView) row.findViewById(R.id.title);
      address = (TextView) row.findViewById(R.id.address);
      icon = (ImageView) row.findViewById(R.id.icon);
    }

    void populateFrom(Restaurant r) {
      name.setText(r.getName());
      address.setText(r.getAddress());

      if (r.getType().equals("sit_down")) {
        icon.setImageResource(R.drawable.ball_red);
      }
      else if (r.getType().equals("take_out")) {
        icon.setImageResource(R.drawable.ball_yellow);
      }
      else {
        icon.setImageResource(R.drawable.ball_green);
      }
    }
  }
}

My real doubt at this moment is where is \getView()\ method ever called? This is working, but in code I cannot understand when is it called. If anyone is familiar with this book, please can you provide me a fast explanation about what's happening in this code?

Thanks :)

vektor
  • 3,312
  • 8
  • 41
  • 71
Tiago Santos
  • 489
  • 5
  • 16
  • possible duplicate of [When getView() in ArrayAdapter is called](http://stackoverflow.com/questions/10160475/when-getview-in-arrayadapter-is-called) – prolink007 Aug 10 '12 at 16:34

1 Answers1

1

getView() is basically called when something is trying to create the View that is associated with an element in that ArrayAdapter.

It will return the View that is created for the element in the ArrayAdapter.


A similar question has been asked before, see if this question helps you any.

Another great tutorial on this subject that may be helpful in explaining what is going on with Adapaters.

Community
  • 1
  • 1
prolink007
  • 33,872
  • 24
  • 117
  • 185
  • 1
    Specifically, in the case of this tutorial, the `ListView` is calling `getView()` on your adapter as it needs rows, both to initially populate the list, and to handle when the user scrolls the list. – CommonsWare Aug 10 '12 at 16:39
  • Hey thanks for reply, so this " super(Now.this, R.layout.row, model);" is trying to create a view right? So at same time it will call getView() wich is defined on import's? And in my code example that method is overrided to garantee it does what we want when is called?? Thanks for help ! – Tiago Santos Aug 10 '12 at 16:40
  • `super(Now.this, R.layout.row, model);` is basically just initializing your `ArrayAdapter` with the parameters you supplied. Here is a link to the source code for `ArrayAdapter` that will give you a better idea of what `super(...)` is doing. https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/ArrayAdapter.java – prolink007 Aug 10 '12 at 16:48
  • i understand it now :) thanks for all replys, it helped me alot! So getView is overrided on super(Now.this, R.layout.row, model); – Tiago Santos Aug 13 '12 at 09:15