【发布时间】:2011-06-07 22:09:15
【问题描述】:
在我的自定义 ListAdapter 中,第一次调用 GetView() 时,convertView 作为 NULL 传入,但第二次作为第一次创建的视图传入。我的 ListView 有 4 行,所有 4 行同时在屏幕上。从文档来看,convertView 似乎应该是一个已经创建并且现在已经从屏幕上滚动出来的视图。我希望 convertView 全部为空 4 次,以便它创建/膨胀 4 个单独的视图。第一次调用 getView 后我应该有一个 convertView 吗?谢谢。
在 OnCreate() 中:
Cursor questions = db.loadQuestions(b.getLong("categoryId"), inputLanguage.getLanguageId(), outputLanguage.getLanguageId());
startManagingCursor(questions);
ListAdapter adapter = new QuestionsListAdapter(this, questions);
ListView list = (ListView)findViewById(R.id.list1);
setListAdapter(adapter);
适配器类
private class QuestionsListAdapter extends BaseAdapter implements ListAdapter{
private Cursor c;
private Context context;
public QuestionsListAdapter(Context context, Cursor c) {
this.c = c;
this.context = context;
}
public Object getItem(int position) {
c.moveToPosition(position);
return new Question(c);
}
public long getItemId(int position) {
c.moveToPosition(position);
return new Question(c).get_id();
}
@Override
public int getItemViewType(int position) {
Question currentQuestion = (Question)this.getItem(position);
if (currentQuestion.getType().equalsIgnoreCase("text"))
return 0;
else if (currentQuestion.getType().equalsIgnoreCase("range"))
return 0;
else if (currentQuestion.getType().equalsIgnoreCase("yesNo"))
return 2;
else if (currentQuestion.getType().equalsIgnoreCase("picker"))
return 0;
else if (currentQuestion.getType().equalsIgnoreCase("command"))
return 0;
else if (currentQuestion.getType().equalsIgnoreCase("datePicker"))
return 0;
else if (currentQuestion.getType().equalsIgnoreCase("diagram"))
return 0;
else
return -1;
}
@Override
public int getViewTypeCount() {
return 7;
}
public int getCount() {
return c.getCount();
}
public View getView(int position, View convertView, ViewGroup viewGroup) {
Question currentQuestion = (Question)this.getItem(position);
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.question_row_text, null);
}
//setup cell
return convertView;
}
}
【问题讨论】:
-
您对文档的分析是正确的。您确定所有四个视图都适合屏幕吗?你能发布一些代码/XML吗?
-
我用代码编辑...我没有添加它,因为一旦调用 GetView() 行为就很明显...所以我认为它与我的 GetView( ) 代码...
-
此外,列表基本上加载正常......我在屏幕上看到所有 4 行。
-
我将其发布为评论,而不是答案,因为我在这里仅凭记忆,但是:我认为这与我所看到的行为一致。你让代码运行完成了吗?如果我没记错的话,GetView 将为要显示的每一行调用两次。我认为第一组调用是为了布局目的,第二组返回实际显示的视图。无论哪种情况,您的代码都应该做同样的事情(同样的事情,只需使用传入的 ConvertView。)
-
@Dan - 我想你实际上已经明白了......看起来它一次通过了所有 4 个,后 3 个传入了第一个创建的 convertView。但是,它再次运行了所有 4 个......这一次,它没有为后 3 个传递一个 convertView。所以这是创建后 3 个视图的时间。非常感谢!
标签: android listview convertview