ConvertView作为仍在屏幕上的视图传入

时间:2011-06-07 22:09:16

标签: android listview convertview

在我的自定义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;
    } 
}

3 个答案:

答案 0 :(得分:3)

如果我没记错的话,对于要显示的每一行,都会调用GetView两次。我认为第一组调用是为了布局目的,第二组是返回实际显示的视图。第二组调用应返回第一组调用中返回的相同视图,这是有道理的。

在任何情况下,您的代码都不应该关心它是否被调用布局或显示。在几乎所有情况下,如果convertView非空,那么通常应该返回convertView;否则,你应该返回一个新视图。

答案 1 :(得分:0)

说实话,我看不出你的代码有多大错。您可能希望尝试扩展CursorAdapter并重新覆盖一些方法,以便它可以为您管理光标。

答案 2 :(得分:0)

快进到2014年,我遇到了同样的问题......这篇文章中没有一个解决方案适合我。在我观看上述答案和评论中引用的Google I / O视频时,答案(对于我的特定情况)在大约19分钟的时间内立即变得明显......

从GETVIEWTYPECOUNT返回的号码()必须在适配器的生命周期内保持不变!!!!

我创建了一个可以动态拥有任意数量类型的视图/数据的适配器......我的getViewTypeCount()方法返回了当前的视图类型数量...所以,如果我曾经添加过新的数据类型返回值的适配器会改变。

使它成为一个常数可以解决我的问题。希望这也将有助于未来的其他人。