如何在列表视图的适配器的 getView 中获取上下文

Posted

技术标签:

【中文标题】如何在列表视图的适配器的 getView 中获取上下文【英文标题】:How to get context in getView of adapter for listview 【发布时间】:2013-11-29 12:36:57 【问题描述】:

我有三个问题:

    我使用 getApplicationContext 与我所见过的所有示例不同,这些示例只是说上下文。我如何在这里获得上下文?还是应用上下文没问题?

    我重写 getView 而不是让它自己处理它是否有任何性能损失(我这样做只是为了设置自定义字体)

    在使用这种方法时我应该注意什么(因为我只是在复制和粘贴,而不知道如果我的列表中有 250 个项目会做什么)。我可能导致的任何潜在泄漏?

我的代码:

private Typeface arabicFont;
arabicFont = Typeface.createFromAsset(getAssets(), "arabicfont.ttf");

...

_arabicAdapter = new SimpleCursorAdapter(this,
                                          R.layout.book_list_item_arabic,
                                          _cursor,
                                          new String[] "NumberArabic", "Arabic",
                                          new int[] R.id.txtNumber, R.id.txtBookName,
                                          CursorAdapter.NO_SELECTION)

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    
        if(convertView == null)
        
            LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.book_list_item_arabic, parent, false);
        

        TextView txtBookName = (TextView)convertView.findViewById(R.id.txtBookName);
        txtBookName.setTypeface(arabicFont);

        txtBookName.setText("\"العربية\"");
        return convertView;
    ;
;

【问题讨论】:

【参考方案1】:
public View getView(int position, View convertView, ViewGroup parent)

ViweGroup 的 parent 肯定不为空,所以 parent.getContext() 可能是获取上下文的最佳方式

【讨论】:

【参考方案2】:

我使用 getApplicationContext 与我看到的所有示例不同,这些示例只是说上下文。我如何在这里获得上下文?还是应用上下文没问题?

您在这里将this 传递给您的构造函数

_arabicAdapter = new SimpleCursorAdapter(this,
                                      R.layout.book_list_item_arabic,
                                      _cursor,
                                      new String[] "NumberArabic", "Arabic",
                                      new int[] R.id.txtNumber, R.id.txtBookName,
                                      CursorAdapter.NO_SELECTION)

这将是您的Context,因此您应该在您的Adapter 中有一个变量,它是您在构造函数中分配的Context 类型。

我重写 getView 而不是让它自己处理它是否有任何性能损失(我这样做只是为了设置自定义字体)

我不知道,但如果它只是一种字体,那么您可以在 style 中为您用于 ListView 项目的 TextView 分配它。

在使用这种方法时我应该注意什么(因为我只是复制和粘贴,而不了解如果我的列表中有 250 个项目会做什么)。我可能导致的任何潜在泄漏?

是的,您应该知道,在不理解代码的情况下复制/粘贴代码总是很麻烦。逐行浏览,确保您了解所有内容。

【讨论】:

上下文似乎不支持 getSystemService() 出于某种原因。说不能静态引用 你做得怎么样?您是否创建了一些变量,例如Context c;,然后将其分配给您在构造函数中传递的上下文,然后执行c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

以上是关于如何在列表视图的适配器的 getView 中获取上下文的主要内容,如果未能解决你的问题,请参考以下文章

自定义列表视图适配器 getView 方法被多次调用,并且顺序不一致

listview 项目未在自定义适配器的 getview 方法中显示分配的值

Android - 通过复选框使用自定义适配器从列表视图中获取项目

滚动时显示随机项目的getView

getView() 在我的自定义列表视图中不起作用

如何在列表视图项中显示和隐藏视图?