3

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

3 回答 3

3

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

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

于 2011-06-15T21:03:14.677 回答
0

老实说,我看不出你的代码有什么问题。您可能想尝试扩展CursorAdapter并覆盖一些方法,以便它可以为您管理光标。

于 2011-06-07T22:49:04.987 回答
0

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

从 GETVIEWTYPECOUNT() 返回的数字必须在适配器的整个生命周期中保持不变!!!!

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

使它成为一个常数解决了我的问题。希望这将在未来对其他人有所帮助。

于 2014-03-06T21:05:34.010 回答