Android Programming tutorials - Tutorial 5
Asked Answered
S

1

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 :)

Suggestive answered 10/8, 2012 at 16:28 Comment(1)
possible duplicate of When getView() in ArrayAdapter is calledHemicrania
H
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.

Hemicrania answered 10/8, 2012 at 16:32 Comment(4)
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.Alec
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 !Suggestive
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. github.com/android/platform_frameworks_base/blob/master/core/…Hemicrania
i understand it now :) thanks for all replys, it helped me alot! So getView is overrided on super(Now.this, R.layout.row, model);Suggestive

© 2022 - 2024 — McMap. All rights reserved.