【问题标题】:Android Programming tutorials - Tutorial 5Android 编程教程 - 教程 5
【发布时间】:2012-08-10 16:28:02
【问题描述】:

您好,我正在做“Android 编程教程”一书中的教程,我在理解教程 5 时遇到问题。这是主要的 Java 类:

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);
      }
    }
  }
}

此时我真正的疑问是 \getView()\ 方法在哪里被调用过?这是有效的,但在代码中我无法理解它何时被调用。如果有人熟悉这本书,请您快速解释一下这段代码中发生了什么?

谢谢:)

【问题讨论】:

标签: android commonsware


【解决方案1】:

getView() 基本上是在尝试创建与 ArrayAdapter 中的元素关联的 View 时调用的。

它将返回为ArrayAdapter 中的元素创建的View


之前有人问过类似的问题,看看这个question对你有没有帮助。

关于这个主题的另一个伟大的tutorial 可能有助于解释Adapaters 的情况。

【讨论】:

  • 具体来说,在本教程的情况下,ListView 在您的适配器上调用 getView(),因为它需要行来初始填充列表,并在用户滚动列表时进行处理.
  • 谢谢您的回复,所以这个“超级(Now.this,R.layout.row,模型);”正在尝试创建视图吗?那么同时它会调用在导入时定义的 getView() 吗?在我的代码示例中,该方法被覆盖以保证它在被调用时执行我们想要的操作?感谢您的帮助!
  • super(Now.this, R.layout.row, model); 基本上只是用您提供的参数初始化您的ArrayAdapter。这是ArrayAdapter 源代码的链接,它可以让您更好地了解super(...) 正在做什么。 github.com/android/platform_frameworks_base/blob/master/core/…
  • 我现在明白了 :) 感谢所有回复,这对我帮助很大!所以 getView 在 super(Now.this, R.layout.row, model); 上被覆盖;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 2011-10-31
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多