Android编程教程-教程5
您好,我正在做《Android编程教程》一书中的教程,我在理解教程5时遇到问题。这是主要的Java类:Android编程教程-教程5,android,commonsware,Android,Commonsware,您好,我正在做《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.Arr
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);
}
}
}
}
package tiago.tutorial;
导入android.app.Activity;
导入android.os.Bundle;
导入android.view.view;
导入android.view.ViewGroup;
导入android.view.LayoutInflater;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.ImageView;
导入android.widget.ListView;
导入android.widget.RadioGroup;
导入android.widget.TextView;
导入java.util.ArrayList;
导入java.util.List;
公共类现在扩展活动{
列表模型=新的ArrayList();
RestaurantAdapter适配器=空;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
按钮保存=(按钮)findViewById(R.id.save);
save.setOnClickListener(onSave);
ListView列表=(ListView)findViewById(R.id.restaurants);
适配器=新餐厅适配器();
list.setAdapter(适配器);
}
private View.OnClickListener onSave=new View.OnClickListener(){
公共void onClick(视图v){
餐厅r=新餐厅();
EditText名称=(EditText)findViewById(R.id.name);
EditText地址=(EditText)findViewById(R.id.addr);
r、 setName(name.getText().toString());
r、 setAddress(address.getText().toString());
射线组类型=(射线组)findViewById(R.id.types);
开关(type.getCheckedRadioButtonId()){
案例R.id.坐下:
r、 setType(“坐下”);
打破
案例R.id.取出:
r、 setType(“取出”);
打破
案例R.id.交付:
r、 setType(“交付”);
打破
}
添加(r);
}
};
类RestaurantAdapter扩展了ArrayAdapter{
RestaurantAdapter(){
super(现在是this,R.layout.row,model);
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图行=转换视图;
RestaurantHolder=null;
如果(行==null){
LayoutInflater充气机=getLayoutInflater();
行=充气机。充气(R.layout.row,父级,false);
持有人=新餐厅持有人(世界其他地区);
row.setTag(支架);
}
否则{
holder=(RestaurantHolder)行。getTag();
}
holder.populateFrom(model.get(position));
返回(行);
}
}
静态类RestaurantHolder{
私有文本视图名称=null;
私有文本视图地址=空;
私有ImageView图标=空;
RestaurantHolder(视图行){
name=(TextView)row.findViewById(R.id.title);
address=(TextView)row.findViewById(R.id.address);
icon=(ImageView)row.findViewById(R.id.icon);
}
无效人群(餐厅r){
name.setText(r.getName());
address.setText(r.getAddress());
if(r.getType().equals(“坐下”)){
图标.setImageResource(R.drawable.ball_红色);
}
else if(r.getType().equals(“take_out”)){
图标.setImageResource(R.drawable.ball_黄色);
}
否则{
图标.setImageResource(R.drawable.ball_绿色);
}
}
}
}
我现在真正的疑问是\getView()\method在哪里调用过?这是可行的,但在代码中我无法理解它何时被调用。如果有人熟悉这本书,你能给我一个关于这段代码中发生了什么的快速解释吗
谢谢:)getView()
基本上是在试图创建与该ArrayAdapter
中的元素关联的视图时调用的
它将返回为ArrayAdapter
中的元素创建的视图
以前也有人问过类似的问题,看看这是否对你有帮助
关于这个主题的另一个很好的例子可能有助于解释Adapaters
的可能重复项,具体来说,在本教程中,ListView
在适配器上调用getView()
,因为它需要行,这两个行都用于最初填充列表,以及用户滚动列表时的处理。嘿,感谢您的回复,所以这个“super(Now.this,R.layout.row,model);”正试图创建一个视图,对吗?所以同时它会调用getView(),它是在import的?在我的代码示例中,该方法被重写,以保证在调用时它会执行我们想要的操作??谢谢你的帮助<代码>超级(Now.this,R.layout.row,model)
基本上只是使用您提供的参数初始化ArrayAdapter
。这里有一个指向ArrayAdapter
源代码的链接,可以让您更好地了解super(…)
正在做什么。我现在明白了:)谢谢你的回复,这对我帮助很大!因此getView在super上被覆盖(现在是this、R.layout.row、model);